防止在C中从float到double的隐式转换

前端之家收集整理的这篇文章主要介绍了防止在C中从float到double的隐式转换前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
基本上,如果我想要这样的东西,@H_301_2@double b = sin(2.2);

但不小心写了这样的东西,

@H_301_2@double b = sin(2.2f);

没有错误甚至是警告信息,即使这显然会导致不同的,不准确的,因此不正确的结果.通过强制编译器不执行float到double的任何隐式转换,可以防止这种类型的错误.有没有办法实现这一点,无论是通过编译开关(最好是在Visual Studio中),一些智能宏,还是一个行为像float / double变量并声明自己的运算符的类?

编辑:我也有兴趣使用运算符解决类似的问题(例如双b = 2.2f * 2.2f)或赋值(double b = 2.2f).

解决方法

您可以使用type_assert实用程序.

例:

@H_301_2@#include <cmath> #include <type_traits> template<typename T,typename U> const U& type_assert(const U& u) { static_assert(std::is_same<T,U>::value,"..."); return u; } int main() { double t = type_assert<double>(std::sin(2.2f)); }

如果预期的类型不同,那么它会给你一个编译器错误.如果它通过,编译器可能会优化它,至少在我的情况下使用-O3.

猜你在找的C&C++相关文章