я столкнулся со следующей проблемой: У меня есть несколько посетителей на для повышения :: варианта, который все делает то же самое для определенного типа, то здесь обув, поэтому методизбежать избыточного кода в повышении :: посетителей вариантных
void operator()(const foo& ast)
{
//allways the same
}
всегда одинаково у каждого посетителя. Поскольку я не хочу писать этот избыточный метод во всех посетителях, я пытался избежать этого, добавляя общий базовый класс, который реализует этот метод, всем посетителям. Проблемы метод вызывает сам посетитель recursivly, как это:
void operator(const foo& ast)
{
for(auto&& item : ast.members)
{
boost::apply_visitor(*this, item);
}
}
и так как все другие методы, которые соответствующие для членов Арента реализованы в базовом классе, я получаю сообщение об ошибке компилятора, на этом. Теперь мой вопрос: как я могу избавиться от моего избыточного кода?
Вот пример того, как эта проблема может выглядеть:
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] –