std::enable_if
をC++ 11でよりよく理解しようとしていて、最小の例を書くことを試みています。クラスがA
であり、メンバ関数がvoid foo()
で、クラステンプレートのタイプT
に基づく実装。
以下のコードは望ましい結果を示していますが、まだ完全に理解していません。バージョンV2
は動作しますが、V1
では動作しません「冗長」タイプU
が必要なのはなぜですか?enable_if:引数のないvoidメンバ関数の最小例
#include <iostream>
#include <type_traits>
template <typename T>
class A {
public:
A(T x) : a_(x) {}
// Enable this function if T == int
/* V1 */ // template < typename std::enable_if<std::is_same<T,int>::value,int>::type = 0>
/* V2 */ template <typename U=T, typename std::enable_if<std::is_same<U,int>::value,int>::type = 0>
void foo() { std::cout << "\nINT: " << a_ << "\n"; }
// Enable this function if T == double
template <typename U=T, typename std::enable_if<std::is_same<U,double>::value,int>::type = 0>
void foo() { std::cout << "\nDOUBLE: " << a_ << "\n"; }
private:
T a_;
};
int main() {
A<int> aInt(1); aInt.foo();
A<double> aDouble(3.14); aDouble.foo();
return 0;
}
クラステンプレートパラメータに基づいvoid foo()
機能の異なる実装を有するために、所望の結果、すなわちを達成するためのより良い方法はありますか?
あなたの例は、 'enable_if'を適切に使用するものではありません。単純なオーバーロードは、あなたのケースを解決します。 'enable_if'は主に*推定された*テンプレートパラメータで役に立ちます。 –
'std :: enable_if'を使うことは、推定された浮動小数点型を、例えば、整数型から分離するのに適しています。このような2つのタイプは、オーバーロードに適しています*。 – WhozCraig
@KerrekSB @WhozCraigどのようにこの特定のケースで過負荷ですか?クラス外の定義 'void A :: foo(){}'と 'void A :: foo(){}'を使用することで、私の意図は、最終的なコードには必要な関数のバージョンしか含まれていないということです(つまり、そのような関数が呼び出されない場合、関数 'A :: foo()はありません)。 –
untergam