मैं एक typedef boost::variant<int, float, double, long, bool, std::string, boost::posix_time::ptime> variant
जो मैं एक struct में मूल्यों के विभिन्न प्रकार के स्टोर करने के लिए उपयोग किया है। उस संरचना में केवल एक विशिष्ट प्रकार को संग्रहीत किया जा रहा है, हालांकि मेरे पास इन structs का वेक्टर है जिसे मुझे जाने और वास्तविक प्रकार को संस्करण से बाहर करने की आवश्यकता है।सामान्य रूप से बढ़ावा :: संस्करण <T> से परिवर्तित टाइप करने के लिए
अब मैं यह कर जब मैं इस प्रकार के बाहर प्रकार रूपांतरण करने की ज़रूरत:
variant second = mystruct.variant;
if (second.which() == 5) //string
{
std::string val = boost::get<std::string>(second);
modvalue->AddNodeAttribute(key, val);
}
else if (second.which() == 0) //int
{
int val = boost::get<int>(second);
modvalue->AddNodeAttribute(key, val);
}
else if (second.which() == 2) //double
{
double val = boost::get<double>(second);
modvalue->AddNodeAttribute(key,val);
}
else if (second.which() == 1) //float
{
float val = boost::get<float>(second);
modvalue->AddNodeAttribute(key, val);
}
else if (second.which() == 3) // long
{
long val = boost::get<long>(second);
modvalue->AddNodeAttribute(key, val);
}
else if (second.which() == 4) // bool
{
bool val = boost::get<bool>(second);
modvalue->AddNodeAttribute(key, val);
}
else if (second.which() == 6) // posix::time
{
boost::posix_time::ptime ptm = boost::get<boost::posix_time::ptime>(second);
modvalue->AddNodeAttribute(key, ptm);
}
मैंने सोचा अगर वहाँ एक अधिक सामान्य तरह से मैं एक सामान्य समारोह लिख कर यह कर के आसपास मिल सकती है कि संस्करण और एक प्रकार टी लेता है जो वापसी मूल्य है। लेकिन जब मैं ऐसा करता हूं तो मुझे अभी भी प्रत्येक प्रकार के टी
जैसे FromVariant<int>(var);
की तरह कुछ बयानों के खाते में समान बयान लिखना है, लेकिन फिर भी मुझे अपने संस्करण में प्रत्येक प्रकार के लिए यह करना होगा।
तो ऐसा लगता है कि मेरी सामान्य समाधान मेरे कोड को कम नहीं करता है, लेकिन यह वृद्धि है, जो स्पष्ट रूप से बात नहीं है। मुझे आश्चर्य हुआ कि अगर किसी के पास मेरे संस्करण के विभिन्न प्रकारों को प्राप्त करने के लिए एक और अधिक शानदार समाधान है जो कि कुछ हद तक सामान्य है, जहां मैं केवल उस प्रकार के फ़ंक्शन को कॉल कर सकता हूं जिसे मैं वापस चाहता हूं?
yup, 'static_visitor' इस सटीक समस्या को हल करने के लिए है। :) – jalf
शायद आप के लिए तुच्छ ... हालांकि मुझे नहीं ... –
@ टोनी, मेरा जवाब बदल गया - माफ करना, मैं दूसरे दृष्टिकोण के लिए कोड नहीं दे सका (यह मेरे कोडबेस में काम पर है!) उपर्युक्त दृष्टिकोण मुझे लगता है कि आपके मामले के लिए अधिक उपयुक्त है, आप बस अपनी संरचना में सभी फ़ील्ड के साथ 'apply_visitor' को कॉल कर सकते हैं उदाहरण के लिए ... – Nim