次与えられたVC++ 2010の使用:私は上記と呼ばれる "B" を希望なぜ、コンパイラは、オーバーロードされた非テンプレート関数に対してこのテンプレート関数を選択していますか?
class Base { };
class Derived : public Base { };
template<class T> void foo(T& t); // A
void foo(Base& base); // B
Derived d;
foo(d); // calls A
foo(static_cast<Base&>(d)); // calls B
を。私はBase
へのキャストでこれを達成することができますが、なぜこれは必要ですか?
Base
(組み込み型など)から派生していないすべての型に対してテンプレート関数を呼びたいのですが、クライアントを必要とせずにBase
から派生した型に対して非テンプレートオーバーロードを呼びたい明示的にキャストする。私はまた、過負荷をテンプレートの特殊化にしようとしましたが、その場合も同じ動作が発生します。私が探しているものを得るための慣用的な方法は何ですか?
これはC++ 11のものですか、それとも古いコードでも機能しますか?クールだから:) –
@ w00te: 'is_base_of'と' enable_if'は、Boost、C++ TR1、およびC++ 11に含まれています。 C++ 11の機能は必要ありません。 C++ 03の言語機能のみを使用してこれらを定義できます。 –
@ w00te:あなたはC++ 03でそれをすることができますが、boostからenable_ifとis_base_ofを取得する必要があります(または独自のロールでC++についていくつか教えてください)。 –