2009-03-30 17 views
8

में कैसे रखा जाए, मैं अज्ञात लंबाई या तर्कों की संख्या के साथ एक संदेश बनाना चाहता हूं। मैंविभिन्न टेम्पलेट प्रकारों को एक वेक्टर

template <typename T> class Argument { 
public: 
    int size; 
    int type; 
    T data; 
}; 

की तरह और के साथ कुछ अतिभारित

addMessage (int value) { 
    Argument<int> *a = new Argument<int>; 
    vec.push_back(a); 
} 

(स्ट्रिंग और इतने पर के लिए एक ही) मैं यह सब पुश करने के लिए एक वेक्टर में कोशिश एक साधारण टेम्पलेट ले लिया। मैं

std::vector<Argument* > vec; 
std::vector<Argument<typename T>* > vec; 
std::vector<Argument<>* > vec; 

कोशिश की, लेकिन इस बात का कुछ भी नहीं काम करने के लिए लगता है। क्या इसे करने का कोई तरीका है? अग्रिम में धन्यवाद।

उत्तर

13

विकल्प 1: सुनिश्चित करें कि सभी प्रकार के तर्क बेस क्लास से प्राप्त होते हैं और उस कक्षा में पॉइंटर्स का उपयोग करते हैं। ध्यान दें कि यह विकल्प स्मृति प्रबंधन के मामले में जोखिम भरा है। आप पॉइंटर्स के बजाय boost :: shared_ptr का उपयोग करके इसे सुरक्षित बनाना चाहते हैं। अन्यथा, जब वेक्टर से कोई आइटम हटाया जाता है तो आपको मैन्युअल रूप से साफ़ करना होगा।

विकल्प 2 (मेरी निजी पसंदीदा): Boost.Variant का उपयोग हर संभव तर्क प्रकार की एक typedef बनाने के लिए और है कि typedef हैं यह करने के लिए सबसे आसान तरीका है एसटीडी में तर्क प्रकार :: वेक्टर

typedef boost::variant<ArgumentType1, ArgumentType2, ArgumentType3> ArgumentType; 
std::vector<ArgumentType> vec; 
+0

ऐसा लगता है कि जब मैं सोचता था कि टेम्पलेट्स को "सभी प्रकार" रखने के लिए बनाया गया है तो मैं गलत था। चूंकि इस परियोजना में कोई बूस्ट नहीं है, फिर भी मैं विरासत के साथ रहूंगा। thx – DaClown

+0

'std :: variant' C++ 17 के बाद उपलब्ध है। http://en.cppreference.com/w/cpp/utility/variant – biowep

4

आप इस्तेमाल कर सकते हैं बढ़ावा :: संस्करण (http://www.boost.org/doc/libs/1_38_0/doc/html/variant.html)
या बढ़ावा देने :: किसी भी (http://www.boost.org/doc/libs/1_38_0/doc/html/any.html) प्रकार

या शून्य * - बदसूरत और नहीं typesafe
या खुद का सामान्य प्रकार है जो एक इंटरफेस होगा लागू और विभिन्न templated कार्यान्वयन और इस इंटरफ़ेस पर सूचक स्टोर करेगा।

लेकिन मुझे यकीन नहीं है कि समान प्रकार का उपयोग करना अच्छा डिज़ाइन है।

6

के रूप में उपयोग करने के लिए एक बेस Argument क्लास होना चाहिए, जो templated नहीं है, और उसके बाद विशिष्ट डेटा प्रकार से प्राप्त होता है। (आप टेम्पलेट संस्करण को बेस क्लास से सीधे प्राप्त कर सकते हैं और केवल उन दो वर्गों का उपयोग कर सकते हैं।) फिर आप उन्हें वेक्टर में पॉइंटर्स के रूप में स्टोर करते हैं।

इसमें तर्क मानों तक पहुंचने और आवश्यकतानुसार कोई भी रूपांतरण करने के लिए कुछ प्रकार के फ़ंक्शंस होने की आवश्यकता होती है।

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