2010-12-27 10 views
9

मैं बढ़ावा lib से निम्न संस्करण है:बढ़ावा :: संस्करण रूपांतरण टाइप करने के लिए

typedef boost::variant<int, float, double, long, bool, std::string, boost::posix_time::ptime> variant; 

अब मैं एक चर के रूप में 'value' एक struct node में घोषित से कोई मान प्राप्त करना चाहते हैं, तो मैं मैंने सोचा जेनेरिक काम कर सकते हैं और फ़ंक्शन को इस प्रकार कॉल कर सकते हैं: find_attribute<long>(attribute);, हालांकि कंपाइलर का कहना है कि इसे संस्करण से लंबे या किसी अन्य प्रकार से नहीं डाला जा सकता है। मैं क्या गलत कर रहा हूं?

template <typename T> 
T find_attribute(const std::string& attribute) 
{ 

    std::vector<boost::shared_ptr<node> >::iterator nodes_iter = _request->begin(); 

    for (; nodes_iter != _request->end(); nodes_iter++) 
    { 
     std::vector<node::attrib>::iterator att_iter = (*nodes_iter)->attributes.begin(); 
     for (; att_iter != att_iter; (*nodes_iter)->attributes.end()) 
     { 
      if (att_iter->key.compare(attribute) == 0) 
      { 
       return (T)att_iter->value; //even explicit cast doesn't wrok?? 
       //return temp; 
      } 

     } 

    } 
} 

उत्तर

22

आपको एक संस्करण से मूल्य प्राप्त करने के लिए boost::get<type>(variant) का उपयोग करना होगा।

7

हो सकता है कि आप के लिए एक बेहतर तरीका visitors उपयोग करने के लिए है - तो आप find_attribute केवल एक बार लिखने के लिए करना होगा:

struct find_attr_visitor : public boost::static_visitor<> 
{ 
    template <typename T> void operator()(T & operand) const 
    { 
     find_attribute(operand); 
    } 
}; 
... 
// calling: 
boost::apply_visitor(find_attr_visitor(), your_variant);