具有纯抽象基类的CRTP:调用开销

时间:2017-11-23 10:41:28

标签: c++ templates crtp

我正在为某些课程使用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>

如果你有一些

,请解释并指出我的参考资料

0 个答案:

没有答案