2012-04-15 14 views
15

Sto cercando di implementare il pattern Visitor per una struttura di oggetti che ha metodi con tipi di ritorno diversi (stringa, signed int, unsigned int, ecc.).Implementazione del pattern Visitor consentendo diversi tipi di restituzione delle funzioni

Ora, nella gerarchia degli oggetti ho aggiunto un metodo Accetta con la seguente firma (in C++):

void Accept(Visitor *); 

non riesco a capire come posso utilizzare la stessa interfaccia (con il tipo di ritorno void) e allo stesso tempo consentire ai miei metodi concreti di avere diversi tipi di rendimento.

+0

È necessario fornire una spiegazione migliore di ciò che si desidera fare. Cosa intendi per * diversi tipi di reso *? Nel modello visitatore, la funzione con l'implementazione corretta non è l''accept', ma piuttosto le implementazioni all'interno del visitatore. –

risposta

14

Il metodo nella gerarchia dei tipi è solo un dispatcher e non ha alcun tipo di reso. Se quello che vuoi è il visita per produrre un valore il modo più semplice sarebbe quella di aggiungere che, come parte dello stato del visitatore:

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; 

Poi di nuovo, i dettagli specifici del visitatore varieranno con il tuo implementazione, ma l'idea è che è possibile memorizzare il risultato nel visitatore anziché restituire it.