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

साथ static_visitor यह संभव आगंतुक ऐसी है कि वह अतिरिक्त डेटा इस प्रकार प्राप्त करता है बदलने के लिए है। कन्स्ट्रक्टर के माध्यम से स्ट्रिंग पास करना इस मामले में एक विकल्प नहीं है।बढ़ावा :: कई तर्क

+0

यह विकल्प क्यों नहीं है? परिवर्तनों के मामले में आप अलग-अलग तारों के साथ एक और परिशिष्ट वस्तु बना सकते हैं। – kennytm

+0

स्ट्रिंग मूल्य किस समय बदल जाएगा? मुझे नहीं लगता कि यह एक कन्स्ट्रक्टर के साथ क्यों नहीं किया जा सकता है। – Mene

+0

@ केनीटीएम परिशिष्ट वर्ग अपने कन्स्ट्रक्टर के माध्यम से कई निर्भरताओं को लेता है। अगर मैं अपनी कक्षा के भीतर परिशिष्ट वस्तु का पुनर्निर्माण करता हूं, तो इस कक्षा को अपने कन्स्ट्रक्टर के माध्यम से परिशिष्ट द्वारा उपयोग की जाने वाली सभी निर्भरताओं को भी लेने की आवश्यकता होगी। मैंने आशा की थी कि मेरी कक्षा बस अपने कन्स्ट्रक्टर के माध्यम से एक परिशिष्ट वस्तु ले लेगी। – Baz

उत्तर

14

प्रत्येक कॉल को दिया गया "अतिरिक्त तर्क" this पॉइंटर है। आपको जो भी अतिरिक्त जानकारी चाहिए, उसे पास करने के लिए इसका उपयोग करें:

#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

यदि आवश्यक हो तो सदस्य को 'std :: string' नहीं होना चाहिए लेकिन उदा। एक 'std :: string *' जो इस प्रकार रिबाउंड हो सकता है। –

+0

@ ल्यूकडैंटन: वास्तव में - स्थिति की सटीक आवश्यकताओं के आधार पर, इस सामान्य विचार पर कई संभावित भिन्नताएं हैं। – Mankarse