私は何度も SFINAE をうまく使いました。クラスが関数を提供しているかどうかを検出することは問題ではありません。私の現在の問題は、彼の問題とは正反対のようです! 派生メソッドも検出する代わりに、クラスのメソッドのみを検出することをお勧めします。メソッドがテンプレートであることが関係しているようです。
クラス テンプレート メソッドを検出することは可能ですか? 害を及ぼさないタイプでテンプレートをインスタンス化しようとしましたが、うまくいきませんでした。
struct A { template<class T> void Func( T ) {}; };
struct B :A {};
template< class T >
struct CheckForFunc
{
typedef char(&YesType)[1];
typedef char(&NoType)[2];
template< class U, void (U::*)( int ) > struct Sfinae;
template< class T2 > static YesType Test( Sfinae<T2,&T2::Func>* );
template< class T2 > static NoType Test( ... );
static const bool value = sizeof(Test<T>(0))==sizeof(YesType);
};
int main(int argc, char* argv[])
{
// gives "1"
std::cout << "Value A=" << CheckForFunc< A >::value << std::endl;
// doesn't compile!
std::cout << "Value B=" << CheckForFunc< B >::value << std::endl;
return 0;
}
エラーメッセージ:
error: ‘&A::Func’ is not a valid template argument for type ‘void (B::*)(int)’ because it is of type ‘void (A::*)(int)’
この SFINAE は、派生ではなく、テンプレート メソッドで非常にうまく機能することに注意してください。悪いのは、間違っていることを検出するだけでなく、コンパイルに失敗することです。
「サンプル」タイプ (ここでは int) を使用せずに SFINAE テストを作成する方法は?
編集: 申し訳ありませんが、C++03 のみです! そして、LLVMはそれで問題ありませんでした.VS2008でもありましたが、GCCとQNXではありませんでした(明日見なければならないバージョン)。
Edit2: Coliru を知らなかった! 非常にクールです、ここにエラーがあります!