将静态访问者与静态多态性层次结构耦合

Kog*_*ido 5 c++ crtp static-polymorphism template-function static-visitor

我的程序的目的是创建一个数据列表,我可以在类层次结构中使用静态多态性时通过一组静态访问者访问该数据列表。

我通过 CRTP 利用静态多态性创建了一个类层次结构:

class VirtualBaseData {
public:    
    //someVirtualFunction
}

template<typename Derived>
class BaseData<Derived> {
public:
    template<typename Visitor>
    void accept(Visitor &v){
         static_cast<Derived*>(this)->accept(v);
    }
}

class DerivedBaseData1: BaseData<DerivedBaseData> {
public:
    template<typename Visitor>
    void accept(Visitor &v){
         //Specific implementation
    }    
}
class DerivedBaseData2: BaseData<DerivedBaseData> {
public:
    template<typename Visitor>
    void accept(Visitor &v){
         //Specific implementation
    }    
}
Run Code Online (Sandbox Code Playgroud)

我想将 DerivedBaseData 存储在一个容器中,以便稍后进行迭代和访问。

int main(){
    std::vector<VirtualBaseData*> dataSet;
    dataSet.push_back(new DerivedBaseData1);
    dataSet.push_back(new DerivedBaseData2);
    for(auto it = fifth.begin(); it != fifth.end(); ++it){
        it->accept(); //Error: VirtualBaseData does not have a member function accept
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种将静态访问者与静态多态性层次结构结合起来的方法。我的静态多态性中需要一个 VirtualBaseData 类,它不是模板类,以便在容器中使用这些类。但是,由于我不能让 VirtualBaseData 类成为模板类,因此我无法像 CRTPattern 中那样创建到派生类的适当 static_cast。

我的问题是:是否有人有一个好的策略可以保留我的静态多态性设置以及静态访问者模式?

仅供参考:我已经按照http://hillside.net/plop/2006/Papers/Library/portableProgrammingPL.pdf第 21-23 页所述实现了静态访问者

gol*_*tar 0

错误是正确的,因为您创建了 VirtualBaseData 指针向量。VirtualBaseData 类不包含accept() 函数。

你的答案是: C++ 类成员函数模板可以是虚拟的吗?

另请阅读有关多态性的内容: http://www.cplusplus.com/doc/tutorial/polymorphism/