在java中,要创建一个返回与参数类型相同的对象并扩展某个类的函数,我会输入:
public <T extends MyClass> T foo(T bar) {...}
有没有相当的C?
换句话说,我如何创建一个函数,它接受任何扩展某个类的类,并返回相同的类型? (这是为了抽象/纯虚拟类的目的).
解决方法:
如果你有C 11或更高版本,我们可以在这里使用enable_if
template<typename T, typename std::enable_if<std::is_base_of<MyClass, T>::value>::type* = nullptr>
T Foo(T bar)
{
return T();
}
例如:
class MyClass
{
public:
int a = 1;
};
class Derived : public MyClass
{
public:
int b = 2;
};
class NotDerived
{
public:
int b = 3;
};
template<typename T, typename std::enable_if<std::is_base_of<MyClass, T>::value>::type* = nullptr>
T Foo(T bar)
{
return T();
}
int main()
{
Derived d;
NotDerived nd;
std::cout << Foo(d).b << std::endl;; // works
//std::cout << (Foo(nd)).b << std::endl;; //compiler error
return 0;
}