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

前端之家收集整理的这篇文章主要介绍了防止在C中从float到double的隐式转换前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
基本上,如果我想要这样的东西,
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.

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