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

ile mümkün şöyle ekstra verileri alır, öyle ki ziyaretçinin değiştirmek mi. Dizeyi yapıcı aracılığıyla iletmek bu durumda bir seçenek değildir.boost :: static_visitor birden argümanlar

+0

Neden bir seçenek değil? Değişiklikler olması durumunda farklı dizeleri olan başka bir Append nesnesi oluşturabilirsiniz. – kennytm

+0

Dize değeri hangi saatte değişecek? Neden bir kurucu ile yapılmadığını da göremiyorum. – Mene

+0

@KennyTM Append sınıfı, kurucusu aracılığıyla bir dizi bağımlılık alır. Eğer sınıfımdaki Append nesnesini yeniden kurgularsam, bu sınıfın ayrıca Append tarafından yapıcısı tarafından kullanılan tüm bağımlılıkları da alması gerekecektir. Sınıfımın kurucusu aracılığıyla bir Append nesnesini alacağını ummuştum. – Baz

cevap

14

Her aramaya verilen "ek argüman" this işaretçisidir. İhtiyacınız olan ek bilgileri geçmek için kullanın:

#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

Gerekirse üyenin bir "std :: string" olması gerekmez, ancak örn. Böylece bir 'std :: string * 'bu da geri tepebilir. –

+0

@LucDanton: Gerçekten de - bu genel fikirde, durumun tam ihtiyacına bağlı olarak birçok olası varyasyon vardır. – Mankarse