Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以使用类型列表构建抽象访问者吗?_C++_Boost - Fatal编程技术网

C++ 我可以使用类型列表构建抽象访问者吗?

C++ 我可以使用类型列表构建抽象访问者吗?,c++,boost,C++,Boost,因此,我有一个抽象类,它是任何使用对象集合的访问者的基础: 类访问者 { 虚拟无效访问(foo)=0; 虚拟无效访问(bar)=0; 虚拟无效访问(baz)=0; 虚拟无效访问(quux)=0; }; 但我也将所有这些类型保存在boost::mpl::list: 使用type_list=boost::mpl::list< 福, 酒吧, 巴兹, 库克斯 >; 每当我添加一个新类型时,就必须更新visitor类,这似乎是一种耻辱。。。是否有任何方法可以通过传递type_list自动生成visit

因此,我有一个抽象类,它是任何使用对象集合的访问者的基础:

类访问者
{
虚拟无效访问(foo)=0;
虚拟无效访问(bar)=0;
虚拟无效访问(baz)=0;
虚拟无效访问(quux)=0;
};
但我也将所有这些类型保存在
boost::mpl::list

使用type_list=boost::mpl::list<
福,
酒吧,
巴兹,
库克斯
>;
每当我添加一个新类型时,就必须更新visitor类,这似乎是一种耻辱。。。是否有任何方法可以通过传递
type_list
自动生成visitor类


std::enable_如果
boost::mpl::find
似乎是一条路要走,但我不能模板化虚拟方法,可以吗?

你不能可变模板化虚拟方法,但你可以模板化基类:

template<class T> class singleVisitorBase { virtual void visit(T) = 0; };

template<class list> class visitor;
template<class... Ts> class visitor<boost::mpl::list<Ts...>>
    : singleVisitorBase<Ts>... {};

继承的性能损失是线性的还是恒定的?就像一个班里有20多位家长的想法有点过分scary@SamKellett在典型的实现中,它应该是常量,尽管会有一些空间开销(20多个vtable指针指向同一vtable);看见
template<class list> class visitor;
template<> class visitor<boost::mpl::list<>> {};
template<class T, class... Ts> class visitor<boost::mpl::list<T, Ts...>>
    : singleVisitorBase<T>, visitor<boost::mpl::list<Ts...>> {};
template<class list, std::size_t N> class visitorImpl;
#define VISITOR_MAX 32
#define VISITOR_VISIT(z,I,_) \
    virtual void visit(typename boost::mpl::at<list, I>::type) = 0;
#define VISITOR_CLASS(z,N,_) \
template<class list>         \
class visitorImpl<list, N>   \
{                            \
    BOOST_PP_REPEAT(N, VISITOR_VISIT, ) \
};
BOOST_PP_REPEAT(VISITOR_MAX, VISITOR_CLASS, )
template<class list> using visitor
    = visitorImpl<list, typename boost::mpl::size<list>::type::value>;