基本上,如果我想要这样的东西,
double b = sin(2.2);
但不小心写了这样的东西,
double b = sin(2.2f);
没有错误甚至是警告信息,即使这显然会导致不同的,不准确的,因此不正确的结果.通过强制编译器不执行float到double的任何隐式转换,可以防止这种类型的错误.有没有办法实现这一点,无论是通过编译开关(最好是在Visual Studio中),一些智能宏,还是一个行为像float / double变量并声明自己的运算符的类?
编辑:我也有兴趣使用运算符解决类似的问题(例如双b = 2.2f * 2.2f)或赋值(double b = 2.2f).
解决方法
您可以使用type_assert实用程序.
例:
#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.