促进abs实施的类型
Type promoting abs implemention
虽然std::abs
(或用于Cdevs的::abs
(不提升返回值,因此不处理std::numeric_limit<T>::min()
,但我希望有一个abs
实现,它可以进行更"安全"的处理。
template <typename T>
typename std::make_unsigned<typename std::enable_if<std::is_signed<T>::value, T>::type>::type secure_abs( T value ) {
if( value >= 0 )
return value;
if( value == std::numeric_limits<T>::min() )
return *reinterpret_cast<typename std::make_unsigned<T>::type*>(&value);
return -value; //TODO: Prevent promotion to int
}
我还没有弄清楚的是,在升级为int之后(删除减号时(如何防止转换警告。
有没有更优雅/正确的去除负号的方法?
编辑:
现在INT_MIN和2完成应该是正确的。
由于对"rank"低于int
的类型使用算术运算时,类型升级到int
是不可避免的,因此我只能看到两种方法来克服此警告:
- 复杂。
return adder(!value, 1);
,其中adder
函数是逐位求和器。您可能会发现它是如何在硬件和自己实现一个 - 很简单。
return static_cast<T>(-value)
。由于您没有任何可能导致类型T
溢出的算术运算,因此"取消"升级到int
是绝对安全的
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 模板元程序查找相似的连续类型名称
- g++ abs()在短整型上似乎将其转换为双精度类型
- abs的返回类型是复杂的
- 为什么std::abs返回有符号类型
- 促进abs实施的类型