c++ - 使用带接口(interface)的 CRTP

标签 c++ c++11 inheritance crtp pure-virtual

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

是否可以让我的专用类继承自使用 CRTP 保存公共(public)代码的模板化抽象类,以及继承自纯虚拟类,这样我就可以创建每种类型的实例,但让我的客户端代码依赖只在界面上?更好的是,我如何使用 CRTP 为客户端代码提供单一接口(interface),同时具有多个实现?

最佳答案

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

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

    //...
}

关于c++ - 使用带接口(interface)的 CRTP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40909907/

相关文章:

java - 继承和多态分配

c++ - 生成当前获胜的随机数 : CPU vs GPU,?

c++ - 2个 future 之间的依赖

c++ - 查找指定起始位置的字符或子字符串

c++ - 无法在声明时使用初始化列表初始化 const char*/string 数组的 vector

c++ - 尝试通过构造函数初始化 String 类。我得到奇怪的输出

C++ 列表迭代器算法

引用类继承方法

c++ - 我对转换运算符的继承感到困惑

C++继承: Base attributes over various derived objects