c – 将静态访问者与静态多态性层次结合起来
我的程序的目的是创建一个数据列表,我可以访问一组静态访问者,同时在我的类层次结构中使用静态多态.
我通过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 } } 我正在寻找一种方法来将静态访问者与静态多态性层次结构相结合. 我的问题是:有没有人有一个好的策略,可以保留我的静态多态设置以及静态访问者模式? 供参考:我已经实现了我的静态访问者,如第27-23页http://hillside.net/plop/2006/Papers/Library/portableProgrammingPL.pdf所述 解决方法
如果你不知道你的对象在编译时会有多少/什么类型,那么它就是动态多态的一个用例(至少,我不知道如何只使用静态多态).
但是……如果您在编译时知道对象的确切数量和类型,现在我们正在谈论!这是一个最小的编译示例(code on ideone): #include <iostream> #include <tuple> #include <type_traits> using namespace std; template<typename Derived> class BaseData { public: template<typename Visitor> void accept(Visitor &v){ static_cast<Derived*>(this)->accept(v); } }; class DerivedBaseData1: BaseData<DerivedBaseData1> { public: template<typename Visitor> void accept(Visitor &v){ std::cout << "DerivedBaseData1: accepting visitor " << v << std::endl; } }; class DerivedBaseData2: BaseData<DerivedBaseData2> { public: template<typename Visitor> void accept(Visitor &v){ std::cout << "DerivedBaseData2: accepting visitor " << v << std::endl; } }; namespace impl { template <size_t N> struct num2type {}; template <size_t Idx,typename T,typename Visitor> void accept_impl(Visitor &v,T &&collection,num2type<Idx>) { // run accept on current object auto &object = std::get<Idx>(collection); object.accept(v); // move iteration forward accept_impl(v,std::forward<T>(collection),num2type<Idx - 1>{}); } template <typename T,num2type<0>) { // run accept on current object auto &object = std::get<0>(collection); object.accept(v); } } template<typename ...Ts,typename Visitor> void accept(Visitor &v,std::tuple<Ts...> &&collection) { using T = decltype(collection); impl::accept_impl(v,impl::num2type<std::tuple_size<std::decay_t<T>>::value - 1>{}); } int main() { using visitor_type = int; visitor_type visitor = 42; DerivedBaseData1 a1,a3; DerivedBaseData2 a2; accept(visitor,std::tie(a1,a2,a3)); return 0; } 使用静态多态性,您可以迭代静态集合(此处为std :: tuple),并在每个集合上使用所需的参数调用所需的方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |