2009-08-26 13 views
7

के साथ बाध्य करें मैं नई ऑब्जेक्ट्स बनाने और बूस्ट :: बाइंड का उपयोग करके ऑब्जेक्ट्स की सूची में जोड़ने की कोशिश कर रहा हूं। उदाहरण के लिए।बूस्ट का उपयोग करना :: एक कन्स्ट्रक्टर

struct Stuff {int some_member;}; 
struct Object{ 
    Object(int n); 
}; 
.... 
list<Stuff> a; 
list<Object> objs; 
.... 
transform(a.begin(),a.end(),back_inserter(objs), 
    boost::bind(Object, 
    boost::bind(&Stuff::some_member,_1) 
) 
); 

यह काम नहीं करता है। बूस्ट :: बाइंड के साथ एक कन्स्ट्रक्टर का उपयोग करने का कोई तरीका है, या मुझे कुछ अन्य विधि आज़माएं?

+0

आपका मतलब "काम पर दिखाई देने" का क्या अर्थ है? यह संकलित नहीं है या सूची पॉप्युलेट नहीं है? – Dewfy

+1

सोम कोड जो वास्तव में संकलित करता है मदद करेगा। ऐसा लगता है कि "ए" क्या है - ऐसा लगता है कि संग्रह शुरू हो गया है और अंत विधियां हैं, लेकिन कुछ_मेम्बर भी? –

+0

जोन, यह मेरे हिस्से में एक त्रुटि थी। यह अभी तय है। Dewfy, कोड संकलित नहीं करता है। –

उत्तर

5

तो Stuff::some_memberint है और Object एक गैर स्पष्ट ctor एक int लेने है, इस काम करना चाहिए:

list<Stuff> a; 
list<Object> objs; 
transform(a.begin(),a.end(),back_inserter(objs), 
    boost::bind(&Stuff::some_member,_1) 
); 

अन्यथा, आप इस्तेमाल कर सकते हैं boost::lambda::constructor

+0

मैंने अपने कोड को थोड़ा सा सरल बना दिया। मेरे असली कोड में कन्स्ट्रक्टर ने तीन तर्क दिए, इसलिए निहित रूपांतरण चाल काम नहीं करती है। लिंक ने मेरे प्रश्न का पूरी तरह उत्तर दिया। धन्यवाद। –

0

यह a::some_member पर वापस निर्भर करता है - यदि यह Object है तो आपको परिणाम को Object सीटीआर में लपेटने की आवश्यकता नहीं है - यह पहले ही बनाया जा चुका है। यदि दिनचर्या Object वापस नहीं कर रही है तो आपको संभवत: परिणाम को मालिश करने की संभावना है, जिसे आप boost::bind के साथ खींच सकते हैं लेकिन एक उपयोगिता फ़ंक्शन कोड को और अधिक पठनीय रख सकता है।

किसी भी मामले में, अधिक कोड मदद करेगा, खासकर a और Object का प्रकार उदाहरण।

+0

मैंने कोड थोड़ा सा बदल दिया। आइए कहें कि मेरे पास ऑब्जेक्ट (int) कन्स्ट्रक्टर और स्टफ :: some_member एक int है। असल में मेरा सवाल यह है कि, फॉर्म को बढ़ावा देने के कुछ भी :: बाइंड (ऑब्जेक्ट, ...) कभी भी काम कर सकते हैं, या रचनाकारों को बांधने के लिए तर्क के रूप में अनुमति नहीं है? –

3

एरिक के लिंक कहते हैं, भाग में "यह है एक निर्माता के पते को लेना संभव नहीं है, इसलिए रचनाकारों को बाध्य अभिव्यक्तियों में लक्षित कार्यों के रूप में उपयोग नहीं किया जा सकता है। " तो मैं जो करने की कोशिश कर रहा था वह असंभव था।

मैं एक समारोह बनाकर उसके चारों ओर हो गया है:

Object Object_factory(int n) 
{ return Object(n); } 

और Object_factory का उपयोग कर मैं कहाँ वस्तु निर्माता का उपयोग करने की कोशिश कर रहा था।

11

यदि आप बूस्ट 1.43 का उपयोग कर रहे हैं, तो आप boost :: factory और boost :: value_factory का उपयोग कर सकते हैं, जो आपको एक कन्स्ट्रक्टर आमंत्रण को समाहित करने देता है। इस तरह:

transform(a.begin(),a.end(),back_inserter(objs), 
    boost::bind(boost::value_factory<Object>(), 
    boost::bind(&Stuff::some_member,_1) 
) 
); 
संबंधित मुद्दे