0

重複の可能性:
メンバー関数の存在を確認するためのC ++テンプレートを作成することは可能ですか?

テンプレートクラスにメンバー関数があるかどうかを判断する方法が必要です。これにより、関数のさまざまな特殊化を呼び出すことができます。たとえば、次のクラスがあります。

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タイプの特性がわからないことと、それを実装する方法がわからないことです。

4

1 に答える 1

-1

そのhttp://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Member_Detectorのメンバー検出イディオムを使用します

于 2012-07-14T06:57:55.250 に答える