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

时间:2018-03-19 17:36:17

标签: c++ templates

我有一个代码(性能至关重要),我可以用单精度和双精度编译。我们在namespace Constants的代码中使用了很多物理常量。以优选精度提供常量的最优雅方式是什么,因为我无法模板化命名空间?

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;
}

2 个答案:

答案 0 :(得分:1)

您可以使用:

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;
}

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

答案 1 :(得分:1)

您可以将命名空间设为类,并使所有常量成为类的静态成员。这适用于任何版本的C ++。

如果您只使用某个版本或更新版本,那么您可以使用C ++ 14中的variable templates。这将允许您将变量声明为模板,然后使用函数中的模板类型来键入它,如

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;
}