混合CRTP或普通虚拟功能?

时间:2020-10-26 11:04:53

标签: c++ polymorphism crtp

我有一个要迭代的类对象的集合,并且希望它们公开一个虚函数。

std::vector<Base*> sampleVector;
//...
for (auto t : sampleVector) t->Function();

最明显的解决方法是使用基本多态性

class Base
{
public:
    virtual void Function() {} //(or = 0 if I want it to be pure virtual)
}

class Derived : public Base
{
public:
    void Function() override { std::cout << "Derived" << std::endl; }
}

另一方面,混合CRTP方式可能是这样

class Base
{
public:
    virtual void Function() {} //(or = 0 if I want it to be pure virtual)
}

template <typename T>
class CRTPBase : public Base
{
public:
    void Function() override { T::Implementation(); }
}

class Derived : public CRTPBase<Derived>
{
public:
    void Implementation() { std::cout << "Derived" << std::endl; }
}

我当时认为第一个可能会更好,因为生成的API可能更直观(用户定义的类仅需继承自Base)。 但是,CRTP方式看起来并不那么直观,如果定义了许多派生类(更简单的虚拟方法表),性能可能会受益。 你对这个有什么看法?我在想什么吗?

0 个答案:

没有答案