C++中奇怪重复模板模式(CRTP)的多态集合?

dru*_*nly 1 c++ polymorphism inheritance crtp c++11

我有一个类Base从我有两个类,DerivedADerivedB定义如下.

template <typename Derived>
class Base{
public:
    double interface(){
        static_cast<Derived*>(this)->implementation();
    }
};

class DerivedA : public Base<DerivedA>{
public:
    double implementation(){ return 2.0;}
};

class DerivedB : public Base<DerivedB>{
public:
    double implementation(){ return 1.0;}
};
Run Code Online (Sandbox Code Playgroud)

简而言之,我正在尝试执行以下操作来维护对象集合,其中一些对象是,其中DerivedA一些是DerivedB:

std::vector<std::shared_ptr<Derived>>
Run Code Online (Sandbox Code Playgroud)

这显然是不可能的,因为我现在已经把这个课程Derived变成了模板课.

有什么办法可以创建/维护多态的对象集合吗?

编辑:不幸的是,一个简单的模板结构不起作用,因为函数implementation在我的实际程序中被模板化 - 所以那时implementation必须是模板化的纯虚函数,这是不可能的.请原谅我缺乏解释.

Che*_*Alf 9

这个答案涉及到这个问题,因为它当时是这个答案.


不要使用不是动态多态的CRTP来创建动态多态.

使用虚拟功能.

这就是他们的目的.

class Base
{
private:
    virtual
    auto implementation() -> double = 0;

public:
    auto interface() -> double { return implementation(); }
};

class DerivedA
    : public Base
{
private:
    auto implementation() -> double override { return 2.0; }
};


class DerivedB
    : public Base
{
private:
    auto implementation() -> double override { return 1.0; }
};
Run Code Online (Sandbox Code Playgroud)

  • @ user2899162:没有办法在评论中追加你的额外要求:( (3认同)

jxh*_*jxh 7

阿尔夫的建议是目标.它很容易适应您的额外要求.使用纯虚方法定义接口:

struct BaseInterface {
    virtual ~BaseInterface() {}
    virtual double interface() = 0;
};
Run Code Online (Sandbox Code Playgroud)

现在,您的模板基类可以从接口派生:

template <typename Derived>
class Base : BaseInterface {
public:
    double interface(){
        static_cast<Derived*>(this)->implementation();
    }
};
Run Code Online (Sandbox Code Playgroud)

现在,您可以创建一个指向接口的指针向量:

std::vector<std::shared_ptr<BaseInterface>>
Run Code Online (Sandbox Code Playgroud)