2012-10-18 17 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); 

Ist es möglich, den Besucher so zu ändern, dass sie zusätzliche Daten erhält, wie folgt:boost :: static_visitor mit mehreren Argumenten

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

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

Dieser String-Wert ändert sich während der Lebensdauer des Objekts anhängen. Das Übergeben der Zeichenfolge über den Konstruktor ist in diesem Fall keine Option.

+0

Warum ist das keine Option? Sie könnten ein anderes Append-Objekt mit anderen Zeichenfolgen erstellen, falls sich das ändert. – kennytm

+0

Zu welcher Zeit ändert sich der String-Wert? Ich verstehe nicht, warum das mit einem Konstruktor auch nicht gemacht werden kann. – Mene

+0

@KennyTM Die Append-Klasse nimmt über ihren Konstruktor eine Reihe von Abhängigkeiten auf. Wenn ich das Append-Objekt innerhalb meiner Klasse rekonstruiere, dann muss diese Klasse auch alle Abhängigkeiten übernehmen, die von Append über ihren Konstruktor verwendet werden. Ich hatte gehofft, dass meine Klasse einfach über ihren Konstruktor ein Append-Objekt aufnehmen würde. – Baz

Antwort

14

Das "zusätzliche Argument", das zu jedem Aufruf gegeben wird, ist der this Zeiger. Verwenden Sie es, um weitere Informationen zu erhalten, die Sie benötigen:

#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

Falls notwendig, muss das Mitglied keine 'std :: string' sein, sondern kann z.B. ein 'std :: string *', das somit zurückprallen kann. –

+0

@LucDanton: In der Tat - es gibt viele mögliche Variationen dieser allgemeinen Idee, abhängig von den genauen Bedürfnissen der Situation. – Mankarse

Verwandte Themen