区分模板中的整数和浮点类型

Mic*_*ael 6 c++ templates

我想对几种整数类型(16,32,64位)和浮点类型(float,double,long double)执行类似但不相同的计算.大多数代码都是相同的,但是对于整数和浮点数,某些部分需要以不同的方式完成.例如,比较int可以用a == b来完成,而比较浮点数应该用abs(ab)来完成

一种方法是将整数和浮点之间不同的代码部分隔离成小函数,并为每种类型专门化模板.但是,我宁愿不为每个整数类型复制粘贴相同的代码,也不为每个浮点类型复制粘贴相同的代码.因此问题是:是否可以同时为多种类型专门化模板功能?如果它是合法的,在语义上类似于以下内容:

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;
}
Run Code Online (Sandbox Code Playgroud)

Erb*_*ica 16

使用C++ 11,可以使用类型特征.请参阅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;
}
Run Code Online (Sandbox Code Playgroud)

返回类型专业化:

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 或者,在返回类型上使用`enable_if`,如在cppreference上(这可以防止任何误用),或者作为带有默认参数的附加模板参数(仅在显式指定模板参数时才会滥用). (2认同)