首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用具有接口的CRTP

使用具有接口的CRTP
EN

Stack Overflow用户
提问于 2016-12-01 11:48:06
回答 1查看 2.1K关注 0票数 8

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-01 12:11:08

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

代码语言:javascript
复制
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();
    }

    //...
}
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40909907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档