この質問に答えようとしている間、型が多形である(またはそうでない)という事実に基づいてメソッドのオーバーロードを許可するためにenable_if
+の使用を提案したいと思いました。disable_if
そこで、小さなテストファイルを作成しました。
template <class T>
void* address_of(T* p,
boost::enable_if< boost::is_polymorphic<T> >* dummy = 0)
{ return dynamic_cast<void*>(p); }
template <class T>
void* address_of(T* p,
boost::disable_if< boost::is_polymorphic<T> >* dummy = 0)
{ return static_cast<void*>(p); }
struct N { int x; };
int main(int argc, char* argv[])
{
N n;
std::cout << address_of(&n) << std::endl;
return 0;
}
これはかなり飼いならされているようです。
しかし、gcc(3.4 ...)はこれを窒息させます:
test.cpp:関数内
int main(int, char**)
:
test.cpp:29:エラー:オーバーロードの呼び出しaddress_of(N*)
があいまいです
test.cpp:17:注:候補は次のとおりです:void* address_of(T*, boost::enable_if<boost::is_polymorphic<T>, void>*)
[T =Nの場合]
test.cpp:20:注:void* address_of(T*, boost::disable_if<boost::is_polymorphic<T>, void>*)
[T=Nの場合]
ここでどのオーバーロードを使用すべきかは、私の人間の心にはかなり明確に思えます。つまり、代替を定義したことは明らかであり、一度に使用できる関数は1つだけです...そして、SFINAEが不要な過負荷の無効化を処理すると思いました。
ダミーの2番目の引数の...
代わりに(省略記号)を使用してパッチを適用しました...しかし、コンパイラがこれをチョークする理由にはまだ興味があります。disable_if