関数テンプレートを作成しようとしています。一方のバージョンは、他方のバージョンの基準を満たさないすべてのタイプに使用する必要があります。引数が特定のクラスの基本クラス、またはそのクラス自体である場合は、他のバージョンを使用する必要があります。
のオーバーロードを試みましBase&
たが、クラスが から派生した場合Base
、特定のものではなく一般的なものを使用します。
私もこのSFINAEアプローチを試しました:
struct Base { };
struct Derived : public Base { };
struct Unrelated { };
template<typename T>
void f(const T& a, bool b = true) {
cout << "not special" << endl;
}
template<typename T>
void f(const Base& t, bool b = is_base_of<Base, T>::value) {
cout << "special" << endl;
}
Base b;
Derived d;
Unrelated u;
f(b); f(d); f(u);
しかし、それらはすべて「特別ではない」と出力されます。私は SFINAE が苦手で、おそらくやり方が間違っているだけです。このような関数をどのように書くことができますか?