相关疑难解决方法(0)

如何找到整数类型在C++中可以表示的值范围?

C++中整数值类型的大小和范围是特定于平台的.在大多数32位系统上找到的值可以在变量中找到.数据类型.- C++文档.您如何确定特定系统的实际大小和范围?

c++ types

11
推荐指数
3
解决办法
2万
查看次数

用于安全整数转换的C++模板

我正在尝试编写一个C++模板函数,它将在不同整数类型之间的转换中抛出整数溢出的运行时异常,具有不同的宽度,以及可能的有符号/无符号不匹配.出于这些目的,我不关心从浮点类型转换为整数类型,也不关心其他对象到对象的转换.我想这样做而不必写很多特殊的案例代码.这就是我目前拥有的:

template< typename T, typename R > void safe_cast( const T& source, R& result )
{
    // get the maximum safe value of type R
    R rMax = (R) ~0;
    if ( rMax < 0 ) // R is a signed type
    {
        // assume that we're on an 8-bit twos-compliment machine
        rMax = ~( 0x80 << ( ( sizeof( R ) - 1 ) * 8 ) );
    }

    if ( ( source & rMax  ) != source ) …
Run Code Online (Sandbox Code Playgroud)

c++ templates casting integer-overflow

11
推荐指数
4
解决办法
6585
查看次数

确定boost变量中的最大sizeof()

鉴于:

boost::variant<T1,T2,T3,...,TN>
Run Code Online (Sandbox Code Playgroud)

在编译时计算以下内容:

max(sizeof(T1), sizeof(T2), sizeof(T3),... ,sizeof(TN))
Run Code Online (Sandbox Code Playgroud)

我不知道如何处理这个,但这个答案揭示了我如何开始.使用两个类型的答案中的代码,T1并且T2,我可以在源文件中使用以下内容来获取更大对象的大小:

size_t largestSize = sizeof(largest<T1, T2>::type);
Run Code Online (Sandbox Code Playgroud)

这正是我想要做的,但我需要largest模板来处理两个以上的类 - 具体来说,它需要检查存储在boost::variant对象中的所有类型.

我知道boost::variant有一个typestypedef,它定义了变体中某种类型的列表.问题是,当我试图绕过实现中的所有boost::mpl内容时,我完全迷失了.我不直观地了解什么boost::variant::types 的,我如何能够将它传递到我自己的模板做了它.

在我看来,这是最终实现的样子:

typedef boost::variant<T1, T2, T3, T4> MyVariant;
size_t largestSize = sizeof(largest<MyVariant::types>::type);
Run Code Online (Sandbox Code Playgroud)

不幸的是,我不知道如何实现这个版本largest.

我不确定这是否是一种合理的方法,所以我愿意接受任何其他方法来实现这一点(可能boost::static_visitor在编译时应用于所有类型?).

c++ templates boost-variant boost-mpl c++11

4
推荐指数
1
解决办法
617
查看次数