我正在尝试编写一个函数模板。一个版本应该用于不满足另一个版本标准的所有类型;当参数是给定类的基类或该类本身时,应使用其他版本。
我尝试过重载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,我可能只是做错了。我怎样才能写出这样的函数?