我有一个要迭代的类对象的集合,并且希望它们公开一个虚函数。
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方式看起来并不那么直观,如果定义了许多派生类(更简单的虚拟方法表),性能可能会受益。 你对这个有什么看法?我在想什么吗?