C++ 如何处理模板化代码中的数学常数

C++ 如何处理模板化代码中的数学常数,c++,templates,C++,Templates,我有一个代码(性能至关重要),可以以单精度和双精度编译。我们在整个代码中使用了大量的物理常量,这些常量来自名称空间常量。当我无法模板化名称空间时,以首选精度提供常量的最优雅方式是什么 namespace Constants { const double meaning_of_life = 42.; } template<typename TF> TF multiply_number(const TF a) { return Constants::meaning_of

我有一个代码(性能至关重要),可以以单精度和双精度编译。我们在整个代码中使用了大量的物理常量,这些常量来自
名称空间常量
。当我无法模板化名称空间时,以首选精度提供常量的最优雅方式是什么

namespace Constants
{
    const double meaning_of_life = 42.;
}

template<typename TF>
TF multiply_number(const TF a)
{
    return Constants::meaning_of_life*a;
}

int main()
{
    double a = multiply_number<double>(5.);
    // With the call below, a cast is done in multiply_number.
    float b = multiply_number<float>(6.);

    return 0;
}
名称空间常量
{
生命的双重意义=42。;
}
模板
TF乘_数(常数TF a)
{
返回常量::表示生命的意义*a;
}
int main()
{
双a=乘U数(5);
//在下面的调用中,将以乘法_数进行转换。
浮点数b=乘u数(6);
返回0;
}
您可以使用:

namespace Constants
{
    template <typename TF> struct meaning_of_life
    {
       static constexpr TF value = 42.;
    };
}

template<typename TF>
TF multiply_number(const TF a)
{
    return Constants::meaning_of_life<TF>::value*a;
}
名称空间常量
{
模板结构表示生命的意义
{
静态constexpr TF值=42。;
};
}
模板
TF乘_数(常数TF a)
{
返回常量::生命的意义::值*a;
}

如果常量需要不同,可以专门化类模板。

可以将名称空间设置为类,并将所有常量设置为类的静态成员。这将适用于任何版本的C++。 如果您可以只使用某个版本或更新的版本,那么您可以使用C++14。这将允许您将变量声明为模板,然后使用函数中的模板类型进行类似的键入

namespace Constants
{
    template <typename T>
    const T meaning_of_life = T(42);
}

template<typename TF>
TF multiply_number(const TF a)
{
    return Constants::meaning_of_life<TF>*a;
}
名称空间常量
{
模板
const T表示生命的意义=T(42);
}
模板
TF乘_数(常数TF a)
{
返回常量::表示生命的意义*a;
}

只需将名称空间转换为存储类型
T
上的模板类,并将所有常量
设为static constexpr T
。因为C++14也可以用于此。而
T(42)
只不过是一个静态强制转换?@Chiel Yeah。这是为了在值将被截断时使警告静音。如果你想让这些警告浮出水面,你不必拥有它。