C++ 如何在模板中定义浮点常量。避免在运行时强制转换

C++ 如何在模板中定义浮点常量。避免在运行时强制转换,c++,c++11,numerical-methods,numerical,C++,C++11,Numerical Methods,Numerical,假设我有一个简单的函数,它的作用如下: template<typename T> T get_half(T a){ return 0.5*a; } 模板 得不到一半(TA){ 返回0.5*a; } 此函数通常在T为双精度或浮点型时进行计算。 标准规定0.5为双精度(浮动为0.5f)。 如何编写上述代码,使0.5始终为T类型,以便在评估产品或退货时不进行强制转换? 我希望0.5在编译时是T类型的常量。这个问题的要点是,我希望避免在运行时进行转换 例如,如果我写: templ

假设我有一个简单的函数,它的作用如下:

template<typename T>
T get_half(T a){
    return 0.5*a;
}
模板
得不到一半(TA){
返回0.5*a;
}
此函数通常在T为双精度或浮点型时进行计算。 标准规定0.5为双精度(浮动为0.5f)。 如何编写上述代码,使0.5始终为T类型,以便在评估产品或退货时不进行强制转换? 我希望0.5在编译时是T类型的常量。这个问题的要点是,我希望避免在运行时进行转换

例如,如果我写:

template<typename T>
T get_half(T a){
    return T(0.5)*a;
}
模板
得不到一半(TA){
返回T(0.5)*a;
}
我能绝对肯定T(0.5)是在编译时计算的吗? 如果没有,那么实现这一目标的正确方法是什么?如果需要的话,我可以使用c++11

先谢谢你

在c++11中,我有一个数字类,如下所示(在头文件中)

模板
结构数字特征{
静态constexpr标量1_半=0.5;
//许多其他有用的常数。。。。
};
因此,在我的代码中,我会将其用作:

template<typename T>
T get_half(T a){
    return numeric_traits<T>::one_half*a;
}
模板
得不到一半(TA){
返回数字特征::一个半*a;
}
这正是我想要的,即0.5在编译时以我需要的精度进行解析,并且在运行时不会发生强制转换。然而,缺点是:

  • 每次我需要一个新的常数时,我都需要修改数值特征
  • sintax可能太烦人了?(当然,这不是什么大问题)
  • 最好有这样的东西:常量(0.5),在运行时解析为T类型

再次感谢您。

没有也不可能有任何方法强制在运行时永远不要计算常量,因为有些机器根本没有一条指令可以加载一种类型的所有可能值。例如,机器可能只有16位加载常量指令,其中运行时需要计算
0x12345678
,因为
0x1234 IIRC应用于文本的显式转换被视为
constepr
,所以是,它是在编译时求值的。@在常量表达式中有效的参数化牛角面包可能仍然在运行时求值。需要在编译时对表达式求值的情况比您想象的要少。@ParamagneticCroissant比您的注释要多。很高兴收到您对我的编辑的反馈。@hvd再次感谢您的关注。也许我的新编辑会澄清?谢谢你的回答。我知道编译器可能会优化像T(0.5)这样的东西。我想我的问题是,如果我想101%确定一个双常数是双常数,一个浮动常数是浮动的,那么最佳实践是什么。例如,我可以在C++11中的numeric traits类中使用constexpr。还有其他解决方案吗?@LightnessRacesinOrbit谢谢。我想我想知道有更多经验和最佳实践的人的意见。另外,使用c++98(没有c++11功能)的解决方案是什么?@Alejandro我回答说:这是可能的,但是
numeric\u traits
超出了这种方法的需要。然而,在我看来,这弊大于利。
template<typename T>
T get_half(T a){
    return numeric_traits<T>::one_half*a;
}
template <typename T>
T get_half(T a) {
    constexpr T half = 0.5;
    return half * a;
}