テンプレートクラスにメンバー関数があるかどうかを判断する方法が必要です。これにより、関数のさまざまな特殊化を呼び出すことができます。たとえば、次のクラスがあります。
class A1 {
void a() const { cout << "a1" << endl; }
};
class A2 {
void a() const { cout << "a2" << endl; }
};
class B {
void b() const { cout << "b" << endl; }
};
テンプレートパラメーターとしてA1またはA2のインスタンスを使用して関数を呼び出す場合、1つのオーバーロード(を利用できますa()
)を呼び出したいのですが、それが存在しない場合は、それなしで実行できます。
標準およびBoostタイプの特性ライブラリを調べていましたが、このようなものは見つかりませんでした。私は基本的に次のようなものが欲しいです:
template <class T>
typename enable_if<has_member<A, a>::value>::type
f(const T& t) {
t.a();
}
template <class T>
typename enable_if<!has_member<A, a>::value>::type
f(const T&) {
cout << "no a" << endl;
}
問題は、has_member
タイプの特性がわからないことと、それを実装する方法がわからないことです。