2012-11-08 24 views
10

list_of यह संकलित:का उपयोग को बढ़ावा देने :: आवंटित ::

std::vector<int> value = boost::assign::list_of(1)(2); 

लेकिन इस:

Constructor(std::vector<int> value) 
{ 
} 

Constructor (boost::assign::list_of(1)(2)); 

वहाँ वेक्टर निर्माता को पारित कर दिया आरंभ के लिए एक एक लाइनर समाधान है?

अभी भी बेहतर है, बजाय एक संदर्भ लेने के द्वारा एक वर्ग चर करने के लिए निर्माता प्रतियां यदि:

enum Foo 
{ 
    FOO_ONE, FOO_TWO 
}; 

class Constructor 
{ 
public: 
    Constructor(const std::vector<Foo>& value){} 
}; 

Constructor c(std::vector<Foo>(boost::assign::list_of(FOO_ONE))); 

मैं:

Constructor(std::vector<int>& value) 
{ 
    _value = value; 
} 

अद्यतन

अगर मैं निम्नलिखित की कोशिश संकलक त्रुटि:

error C2440: '<function-style-cast>' : cannot convert from 'boost::assign_detail::generic_list<T>' to 'std::vector<_Ty>' 
1>   with 
1>   [ 
1>    T=Foo 
1>   ] 
1>   and 
1>   [ 
1>    _Ty=Foo 
1>   ] 
1>   No constructor could take the source type, or constructor overload resolution was ambiguous 
+0

क्या आप संकलक त्रुटि संदेश दे सकते हैं? –

+0

@ केविन मॉलकार्ड जोड़ा गया कंपाइलर त्रुटि – Baz

+2

[ऐसा लगता है कि यह बग है] (https://svn.boost.org/trac/boost/ticket/7364)। –

उत्तर

19

यह एक कष्टप्रद समस्या है, हमारे पास कुछ समय पहले भी था। हम convert_to_container विधि का उपयोग कर यह तय:

Constructor c(boost::assign::list_of(1)(2).convert_to_container<std::vector<int> >()); 

std :: सूची के साथ और अधिक मुद्दों निर्माता में भी का उपयोग कर रहे हैं। उचित उत्तर के लिए Pass std::list to constructor using boost's list_of doesn't compile देखें।

+0

क्या आपको पता चला कि यह' conver_to_container' फ़ंक्शन को कॉल करने के लिए क्यों सक्षम है? –

0

मैं एसटीडी के अस्थायी उदाहरण बनाने के लिए इस टेम्पलेट का उपयोग कर रहा हूँ :: वेक्टर यथा-स्थान:

#include <vector> 
namespace Util { 
//init vector 
template <typename ELEMENT_TYPE > struct vector_of 
    : public std::vector<ELEMENT_TYPE> 
{ 
    vector_of(const ELEMENT_TYPE& t) 
    { 
     (*this)(t); 
    } 
    vector_of& operator()(const ELEMENT_TYPE& t) 
    { 
     this->push_back(t); 
     return *this; 
    } 
}; 
}//namespace Util 

प्रयोग इस प्रकार दिखाई देगा:

Constructor (Util::vector_of<int>(1)(2)); 

निर्माता हस्ताक्षर इस प्रकार दिखाई देगा:

Constructor(const std::vector<int>& value) 
{ 
    _value = value; 
} 
संबंधित मुद्दे