创建取决于模板类型的值常量

时间:2014-03-29 06:26:06

标签: c++ templates types conditional constants

我想创建一个C ++模板函数,它具有在实现中使用的不同常量,具体取决于模板类型的选择。

#define FLOAT_EPSILON       (0.000001f)
#define DOUBLE_EPSILON      (0.00000000000001)

template <class T> void func(T params)
{
    const T epsilon = ???? // either FLOAT_EPSILON or DOUBLE_EPSILON depending on T
    // do some calculations using epsilon
}

template void func(float params);
template void func(double params);

我无法确定如何做到最好,尽管我想到了一些有效的方法。你能帮忙吗?

2 个答案:

答案 0 :(得分:4)

您可以使用辅助模板选择epsilon。

template <typename T> struct EpsilonChooser;

template <> struct EpsilonChooser<float>
{
    float const value = 0.000001f;
};

template <> struct EpsilonChooser<double>
{
    double const value = 0.00000000000001;
};

template <class T> void func(T params)
{
    const T epsilon = EpsilonChooser<T>::value;
    // do some calculations using epsilon
}

答案 1 :(得分:3)

R-Sahu解决方案将转换为C ++ 14中的变量模板,演示here

template <typename T> constexpr T epsilon;

template <> constexpr float  epsilon<float>  = 0.001f;
template <> constexpr double epsilon<double> = 0.000001;