2010-06-17 15 views
7

मैं अपनी खुद की कक्षा वस्तुओं को बढ़ावा से ptr_map में कैसे डाल सकता हूं। ऑब्जेक्ट्स टेम्पलेट किए गए हैं इसलिए मैं मानचित्र में कुछ स्थिर टाइपनाम का उपयोग नहीं कर सकता। तो मैंने किया:किसी भी उपयोग को बढ़ावा दें

ptr_map<string, any> someMap; 

मेरी कक्षा बढ़ावा :: noncopyable इनहेरिट करती है।

someMap.insert("Test", new MyClass<SomeTemplate>()); 

त्रुटि है: त्रुटि: no matching function for call to ‘boost::ptr_map


युपीडी: मैं कुछ आवरण बनाने के लिए पसंद करते हैं और बढ़ावा :: किसी भी उपयोग नहीं करते। तो:

class IWrapper { }; 
class MyClass : public IWrapper { }; 

ptr_map<string, IWrapper> someMap; 
someMap.insert("Test", new MyClass<SomeTemplate>()); 

ऐसा क्यों है (एक ही त्रुटि) काम नहीं करेगा? मैं विरासत वर्ग को पैरेंट इंटरफ़ेस में पास कर सकता हूं। क्या गलत है?

उत्तर

3

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

मैंने सामान्य आधार वर्ग की अनुमति न देने के वैध कारणों को देखा है। इस मामले में boost::variant आमतौर पर सर्वर बेहतर होगा क्योंकि प्रत्येक आइटम को समान रूप से (एक आगंतुक) का इलाज करने के तरीके अभी भी हैं। संकलन समय polymorphism।

मैंने कभी boost::any के लिए वैध उपयोग नहीं देखा है। मैं यह नहीं कह रहा हूं कि कोई नहीं है, लेकिन यह इतना दुर्लभ है कि मैंने कभी इसका सामना नहीं किया है।


उस ने कहा, इसे आजमाएं।

std::map<std::string,boost::any> someMap; 
boost::any insanity = new MyClass<SomeTemplate>; 
someMap.insert("Test",insanity); 

या

boost::ptr_map<std::string,boost::any> someMap; 
boost::any* ive_lost_it = new boost::any(new MyClass<SomeTemplate>); 
someMap.insert("Test", ive_lost_it); 
+0

मेरे क्लास templated है। मैंने नमूना अपडेट किया है। मैं इसके लिए कुछ आधार नहीं बना सकता (टेम्पलेट के बिना)। – Ockonal

+0

ठीक है, धन्यवाद। किसी के साथ जिस तरह से काम करना चाहिए। लेकिन क्या आप कोड के नए अपडेट को देख सकते हैं? मैंने आपके पहले विचार को समझने की कोशिश की। – Ockonal

1

सबसे पहले आप अपने ptr_map के लिए किसी भी * प्रदान करनी चाहिए।
फिर कुंजी एक अंतराल (अपवाद-सुरक्षा मुद्दों के कारण) होना चाहिए।

boost::ptr_map<std::string, any> someMap; 
any * p = new any(MyClass<Sometype>); 
std::string test = "test"; 
someMap.insert(test, p); 

-
यही बात को संपादित यदि आप एक आवरण वर्ग का उपयोग कर रहे हैं। कुंजी एक लाभा होना चाहिए।

जिस तरह से रैपर/बेस क्लास के साथ समस्या यह है कि आप मूल प्रकार पर वापस नहीं आ सकेंगे (और आपके पास टेम्पलेट प्रकार की वजह से गतिशील बहुरूपता नहीं है)।

+0

'लालू' का क्या अर्थ है? क्या आप कुछ नमूना दिखा सकते हैं? – Ockonal

+0

lvalue का मतलब असाइन करने योग्य (और कॉन्स्ट नहीं है)। "परीक्षण" गैर-असाइन करने योग्य और कॉन्स, std :: स्ट्रिंग परीक्षण हालांकि एक अंतराल है। – log0

संबंधित मुद्दे