6

いくつかの整数型 (16、32、64 ビット) と浮動小数点型 (float、double、long double) に対して同様の計算を実行したいと思いますが、同一ではありません。ほとんどのコードは同じですが、int と float で異なる部分を実行する必要があります。たとえば、int の比較は a==b で実行できますが、float の比較は abs(ab) で実行する必要があります。

これを行う 1 つの方法は、int と 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;
}
4

3 に答える 3

3

はい、SFINAE を次のメタ関数と組み合わせて使用​​できます。<type_traits>

#include<type_traits>

template<class IntegralType>
typename std::enable_if<
    std::is_integral<IntegralType>::value,
    bool>::type

isEqual(IntegralType a,IntegralType b)
{
    return a == b;
}

template<class FloatingType>
typename std::enable_if<
    std::is_floating_point<FloatingType>::value,
    bool>::type

isEqual(FloatingType a,FloatingType b)
{
    return fabs(a-b) <  std::numeric_limits<FloatingType>::epsilon();
}
于 2013-11-14T18:22:49.067 に答える