2012-10-18 14 views
9
typedef boost::variant<int, double> Type; 
class Append: public boost::static_visitor<> 
{ 
public: 
    void operator()(int) 
    {} 

    void operator()(double) 
    {} 

}; 

Type type(1.2); 
Visitor visitor; 
boost::apply_visitor(visitor, type); 

E 'possibile cambiare il visitatore in modo tale che esso riceve i dati aggiuntivi come segue:boost :: static_visitor con più argomenti

class Append: public boost::static_visitor<> 
{ 
public: 
    void operator()(int, const std::string&) 
    {} 

    void operator()(double, const std::string&) 
    {} 
}; 

questa stringa valore cambia durante la vita dell'oggetto Append. Passare la stringa tramite il costruttore non è un'opzione in questo caso.

+0

Perché non è un'opzione? È possibile creare un altro oggetto Aggiungi con stringhe diverse nel caso in cui le modifiche. – kennytm

+0

A che ora cambierà il valore della stringa? Non vedo perché non può essere fatto nemmeno con un costruttore. – Mene

+0

@KennyTM La classe Append accetta un numero di dipendenze tramite il suo costruttore. Se ricostruisco l'oggetto Append all'interno della mia classe, allora questa classe dovrà anche prendere tutte le dipendenze usate da Append tramite il suo costruttore. Speravo che la mia classe prendesse semplicemente un oggetto Append tramite il suo costruttore. – Baz

risposta

14

L'"argomento aggiuntivo" che viene assegnato a ciascuna chiamata è il puntatore this. Usalo per passare qualsiasi informazione aggiuntiva di cui hai bisogno:

#include <boost/variant.hpp> 
typedef boost::variant<int, double> Type; 
class Append: public boost::static_visitor<> 
{ 
public: 
    void operator()(int) 
    {} 

    void operator()(double) 
    {} 
    std::string argument; 
}; 

int main() { 
    Type type(1.2); 
    Append visitor; 
    visitor.argument = "first value"; 
    boost::apply_visitor(visitor, type); 
    visitor.argument = "new value"; 
    boost::apply_visitor(visitor, type); 
} 
+1

Se necessario, il membro non deve essere un 'std :: string', ma può essere ad es. un 'std :: string *' che può quindi essere rimbalzato. –

+0

@LucDanton: In effetti, ci sono molte possibili variazioni su questa idea generale, a seconda delle esatte esigenze della situazione. – Mankarse

Problemi correlati