我面临着以下问题冗余代码: 我有升压一些游客::变种,它们都在做同样的特定类型,这里FOO,因此该方法避免的boost ::变种游客
void operator()(const foo& ast)
{
//allways the same
}
在每个访客中都是一样的。 由于我不想在所有访问者中编写这种冗余方法,我尽量避免为所有访问者添加一个实现此方法的通用基类。 问题的方法调用访问者本身recursivly,像这样:
void operator(const foo& ast)
{
for(auto&& item : ast.members)
{
boost::apply_visitor(*this, item);
}
}
因为所有其他的方法,这些方法用于匹配的成员在基类的arent实现,我得到一个编译器错误,在此。 现在我的问题是,我怎样才能摆脱我的冗余代码?
这里是关于问题可能是如何看一个例子:
struct variant_one;
struct variant_two;
struct nil{};
typedef boost::variant<
boost::spirit::x3::forward_ast<variant_one>,
boost::spirit::x3::forward_ast<variant_two>,
nil
> example_variant;
struct variant_one {};
struct variant_two
{
std::vector<example_variant> members;
};
struct visitor_one : boost::static_visitor<void>
{
void operator()(const variant_one& ast)
{
std::cout << "visitor_one detected var_one" << std::endl;
}
//this is the redundant method
void operator()(const variant_two& ast)
{
std::cout << "visitor detected var_two, output members:" <<std::endl;
for(auto&& member : ast.members)
{
boost::apply_visitor(*this, member);
}
}
}
struct visitor_two : boost::static_visitor<void>
{
void operator()(const variant_one& ast)
{
std::cout << "visitor_one detected var_two" << std::endl;
}
//this is the redundant method
void operator()(const variant_two& ast)
{
std::cout << "visitor detected var_two, output members:" <<std::endl;
for(auto&& member : ast.members)
{
boost::apply_visitor(*this, member);
}
}
}
请提供[MCVE] –