我正在为某些课程使用CRTP。但是,我需要在std :: vector中均匀地存储这些类。
解决方案是拥有一个共同的抽象基类。例如,如CRTP维基百科页面中所述:
// Base class has a pure virtual function for cloning
class Shape {
public:
virtual ~Shape() {};
virtual void draw() = 0;
};
// This CRTP class implements clone() for Derived
template <typename Derived>
class Shape_CRTP : public Shape {
public:
void draw() {
static_cast<Derived const&>(*this)->draw();
}
};
class Square: public Shape_CRTP<Square> {
void draw() {/// implement draw}
};
class Circle: public Shape_CRTP<Circle> {
void draw() {/// implement draw}
};
并在主要内容:
std::vector<Shape*> shapes;
for (auto s : shapes) {
s->draw();
}
但是在这种情况下,我不会失去静态多态性的好处,因为我将拥有虚拟调用开销(在公共基类中绘制是虚拟的),并且因为我的绘制实现不会内联?< / p>
如果你有一些
,请解释并指出我的参考资料