使用带接口的 CRTP

Using CRTP with an interface

我有一组 classes 实现相同的业务方法。由于性能原因,我打算使用 CRTP 而不是虚拟调度。但我想保留编码的便利性,以继承和虚拟方法附带的单个接口。

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

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

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();
    }

    //...
}