Внедрение шаблона посетителя при одновременном использовании различных типов возвращаемых функций

Я пытаюсь реализовать шаблон посетителя для структуры объекта, который имеет методы с разными типами возвращаемых значений (строка, подписанный int, unsigned int и т.д.).

Теперь, в иерархии объектов, я добавил метод Accept со следующей сигнатурой (используя С++):

void Accept(Visitor *);

Я не могу понять, как я могу использовать один и тот же интерфейс (с типом возврата void), в то же время позволяя моим конкретным методам иметь разные типы возвращаемых данных.

Ответ 1

Метод Accept в иерархии типов является просто диспетчером и не имеет типа возврата. Если вы хотите, чтобы посещать, чтобы произвести ценность, самым простым способом было бы добавить это как часть состояния посетителя:

struct times2 : visitor {
   double value;
   times2() : value() {}
   void operator()( int x ) { value = x * 2; }
   void operator()( double x ) { value = x * 2; }
};

object o;
times2 v;
o.accept( v );
std::cout << "Result is " << v.value << std::endl;

Затем снова конкретные детали посетителя будут отличаться в зависимости от вашей реализации, но идея состоит в том, что вы можете сохранить результат в посетителе, а не возвращать его.