我的程序的目的是创建一个数据列表,在我的类层次结构中使用静态多态性时,我可以使用一组静态访问者访问该列表。
我通过 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
}
}
我想将 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
}
}
我正在寻找一种将我的静态访问者与我的静态多态层次结构相结合的方法。我的静态多态性中需要一个 VirtualBaseData 类,它不是模板类,以便在容器中使用这些类。但是,由于我不能让 VirtualBaseData 类成为模板类,因此我无法像在 CRTPattern 中那样为派生类创建适当的 static_cast。
我的问题是:有没有人有一个好的策略可以保留我的静态多态设置以及静态访问者模式?
供参考:我已经按照http://hillside.net/plop/2006/Papers/Library/portableProgrammingPL.pdf第 21-23 页中的描述实现了我的静态访问者