使用带有接口的CRTP

rui*_*eco 7 c++ inheritance crtp pure-virtual c++11

我有一组实现相同业务方法的类.由于性能原因,我计划使用CRTP而不是虚拟调度.但是我希望将编码的便利性保留在继承和虚拟方法附带的单个接口上.

是否可以让我的专用类继承自使用CRTP来保存公共代码的模板化抽象类,并且还从纯虚拟类继承,这样我就可以创建每种类型的实例但是我的客户端代码仅依赖于接口?更好的是,如何在多个实现的同时使用CRTP为客户端代码提供单一接口?

Sme*_*eey 7

当然.您可以使用这样的方法,这是完全有效的:

class Interface 
{
public:
    virtual void doSomething() = 0;
    //...
};

template<typename T>
class GeneralImpl : public Interface
{
public:

    void doSomething() override
    {
        auto someDetail = T::somethingStatic();
        //...
        static_cast<T*>(this)->someMember();
        //...
    }
}

class SpecificImpl : public GeneralImpl<SpecificImpl>
{
public:
    static int somethingStatic()
    {
        //...
    }

    void someMember()
    {
        //...
    }
};

int main()
{
    std::vector<Interface*> vec;
    SpecificImpl instance;

    //...

    vec.push_back(&instance);

    //...

    for(auto* inst : vec) {
        inst->doSomething();
    }

    //...
}
Run Code Online (Sandbox Code Playgroud)

  • 因此,您可以充分利用这两个方面:低级实现的模板效率,但仍然是顶级虚拟多态的优势,例如,客户端可以将所有多态实例保存在单个容器中. (2认同)