C相当于用于java参数/返回类型

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;
}

Live Demo

上一篇:Java高级——泛型


下一篇:java – Implements vs extends:何时使用?有什么不同?