2012-04-15 1 views
15

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

Теперь в иерархии объектов Я добавил Accept метод со следующей подписью (с помощью C++):

void Accept(Visitor *); 

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

+0

Вы должны предоставить лучшее объяснение того, что вы хотите сделать. Что вы подразумеваете под * различными типами возврата *? В шаблоне посетителя функция с правильной реализацией не является «accept», а скорее реализацией внутри посетителя. –

ответ

14

Метод 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; 

Опять же, конкретные детали посетитель будет меняться в зависимости от вашего но идея состоит в том, что вы можете сохранить результат у посетителя, а не return it.