我想对几种整数类型(16、32、64位)和浮点类型(float,double,long double)执行类似但不完全相同的计算。大部分代码是相同的,但是对于int和float,有些部分需要做不同的处理。例如,比较int可以使用a == b完成,而比较浮点数则可以使用abs(a-b)完成

做到这一点的一种方法是将ints和float之间不同的代码部分隔离为小函数,并针对每种类型专门设计模板。但是,我不想为每种整数类型复制粘贴相同的代码,而为每种浮点类型复制粘贴另一种代码。因此,问题就来了:是否可以一次专门针对多种类型的模板函数?如果合法,则在语义上类似于以下内容:

template<>
bool isEqual< short OR long OR long long >( T a, T b ) {
    return a == b;
}

template<>
bool isEqual< float OR double OR long double >( T a, T b ) {
    return abs( a - b ) < epsilon;
}

最佳答案

在C++ 11中,可以使用type traits。请参阅 std::enable_if 文档
在您的情况下,可能看起来像这样:

功能参数特化:

template<class T>
bool isEqual(T a, T b, typename std::enable_if<std::is_integral<T>::value >::type* = 0)
{
    return a == b;
}

template<class T>
bool isEqual(T a, T b, typename std::enable_if<std::is_floating_point<T>::value >::type* = 0)
{
    return abs( a - b ) < epsilon;
}

返回类型专长:
template<class T>
typename std::enable_if<std::is_integral<T>::value, bool >::type isEqual(T a, T b)

{
    return a == b;
}

template<class T>
typename std::enable_if<std::is_floating_point<T>::value, bool >::type isEqual(T a, T b)
{
    return abs( a - b ) < epsilon;
}

10-08 09:27
查看更多