SFINAEを使用して、指定されたクラスに対して空き関数がオーバーロードされているかどうかを検出する方法はありますか?SFINAE:クラスに空き関数があるかどうかを検出
基本的に、私は以下のソリューションを持っている:
struct has_no_f { };
struct has_f { };
void f(has_f const& x) { }
template <typename T>
enable_if<has_function<T, f>::value, int>::type call(T const&) {
std::cout << "has f" << std::endl;
}
template <typename T>
disable_if<has_function<T, f>::value, int>::type call(T const&) {
std::cout << "has no f" << std::endl;
}
int main() {
call(has_no_f()); // "has no f"
call(has_f()); // "has f"
}
単にそこfoo
とbar
タイプの多くは、実際にあるとcall
機能は、それらの知識を持たないため、基本的には(動作しませんcall
をオーバーロードcall
は内部にあり、ユーザは自分のタイプを提供します)。
私はC++ 0xを使うことができません。すべての現代的なコンパイラのための解決策が必要です。
注:残念ながらここではsimilar questionへの解決策はありません。
非常に不都合な問題です。私は解決策も知りたい。 –
インスタンシエーションの時点でしか表示されない機能を検出しますか? –
@Johannes私の場合は本当に問題ではありません。 (関数テンプレートの)インスタンシエーションの時点で、すべての候補関数*がわかります。 –