如何确定撤销类型表达式的更大类型
How to determine a larger type of a decltype expression
假设我有这样一个函数:
static const boost::int32_t SOME_CONST_VALUE = 1073741823;
template<typename targetType, typename sourceType>
targetType Convert(sourceType source)
{
typedef decltype(source * SOME_CONST_VALUE) MulType_t;
//typedef boost::int64_t MulType_t;
MulType_t val = (MulType_t)source * (MulType_t)SOME_CONST_VALUE;
return val / (MulType_t)SOME_CONST_VALUE;
}
当我像这样调用这个函数
boost::int32_t i = std::numeric_limits<boost::int32_t>::max();
boost::int32_t k = Convert<boost::int32_t>(i);
k = 1,因为在乘法过程中溢出。将所有内容都转换为boost::int64_t
将导致我想要的结果。但是我不想将short或char类型强制转换为int64类型的值。
那么我可以使用decltype来获得表达式的下一个更大的类型吗?
您必须为它创建自己的模板专门化:
template<typename tp>
class bigger { }
template
class bigger<boost::int8_t>
{
typedef boost::int16_t type;
}
template
class bigger<boost::int16_t>
{
typedef boost::int32_t type;
}
template
class bigger<boost::int32_t>
{
typedef boost::int64_t type;
}
如果你不喜欢大量输入,你也可以创建一个宏:
#define BIGGER(x, y)
template
class bigger<boost::int##x##_t>
{
typedef boost::int##y##_t type;
}
BIGGER(8, 16);
BIGGER(16, 32);
BIGGER(32, 64);
然后像
一样使用bigger<boost::int32_t>::type x;
Dani的答案有正确的想法,但重新做了一遍。
提振。整数是为了解决整数类型选择的问题。
static const boost::int32_t SOME_CONST_VALUE = 1073741823;
template<typename targetType, typename sourceType>
targetType Convert(sourceType source)
{
typedef typename boost::int_t< 8 * sizeof( sourceType ) + 1 >::fast MulType_t;
MulType_t val = static_cast<MulType_t>(source) * static_cast<MulType_t>(SOME_CONST_VALUE);
return val / static_cast<MulType_t>(SOME_CONST_VALUE);
}
不仅避免了新的代码(和新的bug),而且您将使用最快的类型进行您想要的操作。如果速度不是你追求的,Boost。整数也可以选择最小类型
相关文章:
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 如何计算具有指定类型的表达式的相对精度和绝对精度
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 有没有办法一次声明相同类型的多个对象,并通过一个表达式立即使用相同的右值初始化它们?
- 表观调用前面的表达式必须具有指向 func 类型的指针
- 数组类型 int[n][n] 不可赋值,因为表达式必须具有常量值
- 正则表达式以匹配数字的重复模式,后跟任何类型的分隔符?
- C++ 编译错误:意外的类型名称"字符串":预期的表达式
- 表达式必须具有类类型 vs.
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 非类类型表达式的静态类型与动态类型之间的差异
- 如何确定涉及 C++ 中除法的算术表达式的数据类型
- 结构化绑定初始值设定项表单 { 赋值表达式 } 对于 clang 上的数组类型失败
- 下标需要数组或指针类型表达式必须具有指针对象类型
- 带有数组类型表达式的错误分配
- 表示函数参数的元组的类型表达式
- 如何确定撤销类型表达式的更大类型
- c++ 11中有新的函数类型表达式格式吗?