अकेले Field
एक प्रकार नहीं है, लेकिन एक टेम्पलेट जो प्रकार के एक परिवार उत्पन्न कर सकते हैं, इस तरह के रूप Field<int>
और Field<double>
। ये सभी फ़ील्ड इस तरह से संबंधित नहीं हैं कि किसी को किसी अन्य तरह से प्राप्त किया गया है। तो आपको इन सभी जेनरेट किए गए प्रकारों के बीच कुछ संबंध स्थापित करना होगा।
class FieldBase { };
template <typename T>
class Field : public FieldBase {
private:
T value;
DataType<T> type;
};
class Row {
private:
std::map<unsigned long,FieldBase*> column;
};
और कोड में कि कच्चे सूचक के बजाय स्मार्ट सूचक का उपयोग करें: एक तरह से एक आम गैर टेम्पलेट आधार वर्ग का प्रयोग है। वैसे भी, अब समस्या यह है कि टाइप-सूचना खो जाती है - चाहे आप Field<double>
या Field<int>
पर इंगित करें, अब और ज्ञात नहीं है और केवल तमाम द्वारा सेट किए गए आधार में किसी प्रकार का प्रकार-ध्वज रखकर पता लगाया जा सकता है व्युत्पन्न वर्ग - या
dynamic_cast<Field<int>*>(field) != 0
का उपयोग करके आरटीटीआई पूछकर लेकिन यह बदसूरत है। विशेष रूप से क्योंकि आप जो चाहते हैं वह एक मूल्य अर्थपूर्ण है। मैं आप अपनी पंक्ति की प्रतिलिपि बनाने में सक्षम होना चाहता हूं, और यह इसमें सभी फ़ील्ड कॉपी करेगा। और जब आप डबल को संग्रहीत करते हैं तो आप दो बार प्राप्त करना चाहते हैं - आरटीटीआई का उपयोग पहले व्युत्पन्न प्रकार के लिए अपना रास्ता हैक करने के लिए।
ऐसा करने का एक तरीका एक भेदभाव संघ का उपयोग करना है। यह मूल रूप से कुछ मनमाना प्रकारों के लिए एक संघ है और इसके अलावा एक प्रकार-ध्वज, जो स्टोर करता है कि वर्तमान में उस क्षेत्र में कौन सा मूल्य संग्रहीत किया जाता है (जैसे कि एक डबल, int, ...)। उदाहरण के लिए:
template <typename T>
class Field {
private:
T value;
DataType<T> type;
};
class Row {
private:
std::map<unsigned long,
boost::variant< Field<int>, Field<double> > >
column;
};
बूस्ट :: संस्करण आपके लिए सभी काम करता है। आप सही ओवरलोड का उपयोग करके इसे एक मजेदार बनाने के लिए विज़िट का उपयोग कर सकते हैं।इसके manual
स्रोत
2009-02-20 10:58:24
तो सवाल क्या है? –
आपको अपने कोड को एचटीएमएल में बदलना नहीं है। इसे 4 वर्ण इंडेंटेशन के साथ ही रखें। –
डेव में: मेरा प्रश्न है: चूंकि फ़ील्ड टेम्पलेट है, मैं std :: मानचित्र को "बता" कैसे सकता हूं कि मान "किसी भी प्रकार का फ़ील्ड" हैं? litb: सुझाव के लिए धन्यवाद! :-) – jbatista