सौभाग्य से ... सी ++ कक्षा पदानुक्रम के क्रमिकरण के लिए एक डिफ़ॉल्ट तंत्र लागू नहीं करता है।(मैं मानक पुस्तकालय या कुछ में एक विशेष आधार प्रकार के द्वारा आपूर्ति की एक वैकल्पिक तंत्र की आपूर्ति यह कोई फ़र्क नहीं पड़ेगा, लेकिन कुल इस मौजूदा Abis पर सीमा डाल सकता है)
हाँ क्रमबद्धता अविश्वसनीय रूप से महत्वपूर्ण है और आधुनिक सॉफ्टवेयर में शक्तिशाली है अभियांत्रिकी। मैं इसे किसी भी समय रनटाइम उपभोग्य डेटा के कुछ रूपों से और कक्षा वर्ग पदानुक्रम का अनुवाद करने की आवश्यकता है। तंत्र जो मैं हमेशा चुनता हूं वह प्रतिबिंब के कुछ रूपों पर आधारित होता है। नीचे इस पर अधिक।
आप जटिलताओं के विचार के लिए here भी देखना चाहेंगे और यदि आप वास्तव में मानक के खिलाफ सत्यापित करना चाहते हैं तो आप purchase a copy here कर सकते हैं। ऐसा लगता है कि अगले मानक के लिए वर्किंग ड्राफ्ट github पर है।
आवेदन विशिष्ट प्रणालियों
सी ++/सी आवेदन के लेखक स्वतंत्रता प्रौद्योगिकियों लोगों को ले के कई के पीछे यांत्रिकी चयन करने के लिए नए और अक्सर उच्च स्तर भाषाओं के साथ प्रदान करने के लिए अनुमति देते हैं। प्रतिबिंब (RTTI), अपवाद, संसाधन/मेमोरी प्रबंधन (कचरा संग्रह, RAII, आदि)। ये सिस्टम सभी किसी विशेष उत्पाद की समग्र गुणवत्ता को संभावित रूप से प्रभावित कर सकते हैं।
मैंने वास्तविक समय गेम, एम्बेडेड डिवाइस, मोबाइल ऐप्स, वेब अनुप्रयोगों से सबकुछ पर काम किया है और विशेष परियोजना के समग्र लक्ष्यों में से सभी के बीच भिन्नता है।
अक्सर वास्तविक समय के लिए उच्च प्रदर्शन गेम के लिए आप स्पष्ट रूप से RTTI अक्षम कर सकते हैं (यह ईमानदार होने के लिए सी ++ में बहुत उपयोगी नहीं है) और संभवतः यहां तक कि अपवाद भी (कई लोग यहां उत्पादित ओवरहेड की इच्छा नहीं रखते हैं और यदि आप थे वास्तव में पागल आप अपने स्वयं के रूप को लंबे कूद से और इस तरह से लागू कर सकते हैं। मेरे लिए अपवाद एक अदृश्य इंटरफ़ेस बनाते हैं जो प्रायः बग बनाता है जो लोग संभव होने की उम्मीद भी नहीं करेंगे, इसलिए मैं अक्सर उन्हें अधिक स्पष्ट तर्क के पक्ष में उनसे बचता हूं।)।
कचरा संग्रह डिफ़ॉल्ट रूप से सी ++ में शामिल नहीं है और वास्तविक समय गेम में यह एक आशीर्वाद है। निश्चित रूप से आप वृद्धिशील जीसी और अन्य अनुकूलित दृष्टिकोण प्राप्त कर सकते हैं जिन्हें मैंने कई गेम उपयोग किए हैं (अक्सर यह मौजूदा जीसी का एक संशोधन है जैसे मोनो सी # में उपयोग किया जाता है)। कई गेम पूलिंग का उपयोग करते हैं और अक्सर स्मार्ट पॉइंटर्स द्वारा संचालित सी ++ RAII के लिए। मेमोरी उपयोग के विभिन्न पैटर्न के साथ अलग-अलग प्रणालियों को रखना असामान्य नहीं है, जिन्हें अलग-अलग तरीकों से अनुकूलित किया जा सकता है। मुद्दा यह है कि कुछ अनुप्रयोगों ने दूसरों को अधिक किरदार के बारे में जानकारी दी है।
प्रकार पदानुक्रम का स्वत: क्रमांकन के जनरल विचार
प्रकार पदानुक्रम के एक स्वचालित क्रमबद्धता प्रणाली के सामान्य विचार एक प्रतिबिंब प्रणाली है कि एक सामान्य इंटरफ़ेस से कार्यावधि में प्रकार की जानकारी क्वेरी कर सकता है उपयोग करने के लिए है। नीचे मेरा समाधान मैक्रोज़ की मदद से कुछ बेस प्रकार इंटरफेस पर विस्तार करके उस जेनेरिक इंटरफ़ेस को बनाने पर निर्भर करता है। अंत में आप मूल रूप से एक गतिशील vtable प्राप्त करते हैं जिसे आप इंडेक्स या क्वेरी द्वारा सदस्यों/प्रकारों के स्ट्रिंग नामों द्वारा पुन: सक्रिय कर सकते हैं।
मैं बेस प्रतिबिंब पाठक/लेखक प्रकार का भी उपयोग करता हूं जो व्युत्पन्न स्वरूपण को ओवरराइड करने की अनुमति देने के लिए कुछ iostream इंटरफेस का खुलासा करता है। मेरे पास वर्तमान में एक बाइनरी ऑब्जेक्टियो, JSONObjectIO, और ASTObjectIO है लेकिन दूसरों को जोड़ने के लिए यह छोटा है। इसका मुद्दा पदानुक्रम से किसी विशेष डेटा प्रारूप को क्रमबद्ध करने और इसे धारावाहिक में डालने की जिम्मेदारी को हटाना है।भाषा के स्तर
पर
प्रतिबिंब कई स्थितियों में आवेदन जानता है कि यह क्रमानुसार करने चाहते हैं और वहाँ यह भाषा में हर वस्तु में निर्माण करने के लिए कोई कारण नहीं है कि कौन सा डेटा। कई आधुनिक भाषाओं में RTTI भी सिस्टम के मूल प्रकारों में शामिल हैं (यदि वे प्रकार आधारित सामान्य इंट्रिनिक्स हैं, तो int, float, double, आदि)। आवेदन के उपयोग के बावजूद सिस्टम में सब कुछ के लिए अतिरिक्त डेटा संग्रहीत करने की आवश्यकता है। मुझे यकीन है कि कई आधुनिक कंपाइलर कभी-कभी पेड़ को हिलाकर कुछ अनुकूलित कर सकते हैं, लेकिन आप इसकी गारंटी भी नहीं दे सकते। हालांकि वे पदानुक्रम संभाल वास्तविक क्रमबद्धता कार्य होने से कुछ लचीलापन की कमी
एक कथात्मक दृष्टिकोण
तरीकों पहले ही उल्लेख किया, सभी वैध उपयोग के मामलों रहे हैं। यह पदानुक्रम पर बॉयलरप्लेट स्ट्रीम हेरफेर के साथ आपके कोड को भी मिटा सकता है।
मैं व्यक्तिगत रूप से प्रतिबिंब के माध्यम से एक और घोषणात्मक दृष्टिकोण पसंद करता हूं। मैंने अतीत में क्या किया है और कुछ स्थितियों में करना जारी रखना मेरे सिस्टम में एक आधार प्रतिबिंबित प्रकार है। मैं कुछ बॉयलरप्लेट तर्क के साथ-साथ स्ट्रिंग कॉन्सटेनेशन मैक्रोज़ के प्रीप्रोसेसर के साथ मदद करने के लिए template metaprogramming का उपयोग कर समाप्त करता हूं। अंत परिणाम एक आधार प्रकार है जिसे मैं इंटरफेस का पर्दाफाश करने के लिए एक परावर्तनीय मैक्रो घोषणा और गड़बड़ी को लागू करने के लिए एक परावर्तनीय मैक्रो परिभाषा (प्रकार के लुकअप टेबल में पंजीकृत सदस्य को जोड़ने जैसे कार्य) से प्राप्त होता हूं।
class ASTNode : public Reflectable
{
...
public:
DECLARE_CLASS
DECLARE_MEMBER(mLine,int)
DECLARE_MEMBER(mColumn,int)
...
};
फिर कुछ इस तरह सीपीपी में:
BEGIN_REGISTER_CLASS(ASTNode,Reflectable);
REGISTER_MEMBER(ASTNode,mLine);
REGISTER_MEMBER(ASTNode,mColumn);
END_REGISTER_CLASS(ASTNode);
ASTNode::ASTNode()
: mLine(0)
, mColumn(0)
{
}
मैं तो साथ सीधे प्रतिबिंब इंटरफ़ेस का उपयोग कर सकते हैं
तो मैं सामान्य रूप से कुछ है कि में ज इस तरह दिखता है के साथ खत्म कुछ विधियां जैसे:
int id = myreflectedObject.Get<int>("mID");
myreflectedObject.Set("mID", 6);
लेकिन आमतौर पर मैं कुछ "लक्षण" डेटा को फिर से शुरू करता हूं कि मैं एक और इंटरफेस के साथ संपर्क में है:
ReflectionInfo::RefTraitsList::const_iterator it = info->getReflectionTraits().begin();
वर्तमान लक्षण आपत्ति इस तरह दिखता है:
class ReflectionTraits
{
public:
ReflectionTraits(const uint8_t& type, const uint8_t& arrayType, const char* name, const ptrType_t& offset);
std::string getName() const{ return mName; }
ptrType_t getOffset() const{ return mOffset; }
uint8_t getType() const{ return mType; }
uint8_t getArrayType() const{ return mArrayType; }
private:
std::string mName;
ptrType_t mOffset;
uint8_t mType;
uint8_t mArrayType; // if mType == TYPE_ARRAY this will give the type of the underlying data in the array
};
मैं वास्तव में मेरी मैक्रो है कि मुझे इस थोड़ा आसान बनाने के लिए अनुमति देने के लिए सुधार के साथ आए हैं। .. लेकिन उन लोगों को एक वास्तविक परियोजना से लिया गया है जो मैं वर्तमान में काम कर रहा हूं। मैं फ्लेक्स, बाइसन और एलएलवीएम का उपयोग कर एक प्रोग्रामिंग भाषा विकसित कर रहा हूं जो सी एबीआई और वेबसाइब्स को संकलित करता है। मैं जल्द ही इसे खोलने की उम्मीद कर रहा हूं, इसलिए यदि आप विवरण में दिलचस्पी रखते हैं तो मुझे बताएं।
यह ध्यान देने योग्य बात यह है कि "लक्षण" जानकारी मेटाडेटा है जो रनटाइम पर पहुंच योग्य है और सदस्य का वर्णन करती है और आमतौर पर सामान्य भाषा स्तर प्रतिबिंब के लिए बहुत अधिक होती है। यहां जो जानकारी मैंने शामिल की है, वह सब मुझे अपने प्रतिबिंबित प्रकारों के लिए जरूरी था।
किसी भी डेटा को क्रमबद्ध करते समय ध्यान में रखने के लिए अन्य महत्वपूर्ण पहलू संस्करण जानकारी है। उपरोक्त दृष्टिकोण डेटा को तब तक ठीक कर देगा जब तक आप आंतरिक डेटा संरचना को बदलना शुरू नहीं करते। हालांकि, आप अपने क्रमिकरण प्रणाली के साथ एक पोस्ट और संभवतः पूर्व डेटा क्रमबद्धता हुक तंत्र शामिल कर सकते हैं ताकि आप प्रकार के नए संस्करणों का अनुपालन करने के लिए डेटा को ठीक कर सकें। मैंने इसे इस तरह के सेटअप के साथ कुछ बार किया है और यह वास्तव में अच्छी तरह से काम करता है।
इस तकनीक के बारे में एक अंतिम नोट यह है कि आप स्पष्ट रूप से नियंत्रित कर रहे हैं जो यहां क्रमबद्ध है। आप उस डेटा को चुन और चुन सकते हैं जिसे आप क्रमबद्ध करना चाहते हैं और वह डेटा जो कुछ क्षणिक ऑब्जेक्ट स्थिति का ट्रैक रख सकता है।
सी ++ लैक्स की गारंटी देता है
एक बात नोट करने के लिए ... के बाद से सी ++ डेटा वास्तव में कैसा दिखता है के बारे में बहुत सुस्त है। आपको अक्सर कुछ प्लेटफ़ॉर्म विशिष्ट विकल्प बनाना पड़ता है (यह शायद मानक सिस्टम प्रदान नहीं किए जाने वाले मुख्य कारणों में से एक है)। आप वास्तव में टेम्पलेट मेटाप्रोग्रामिंग के साथ संकलन समय पर एक बड़ा सौदा कर सकते हैं, लेकिन कभी-कभी 8 बिट्स होने के लिए अपने char
को मानना आसान होता है। हां, यह सरल धारणा सी ++ में 100% सार्वभौमिक नहीं है, सौभाग्य से ज्यादातर स्थितियों में यह है।
मैं जिस दृष्टिकोण का उपयोग करता हूं वह स्मृति लेआउट निर्धारित करने के लिए नल पॉइंटर्स के कुछ गैर-मानक कास्टिंग करता है (फिर मेरे उद्देश्यों के लिए यह जानवर की प्रकृति है)। निम्नलिखित मैक्रो द्वारा प्रदान किए जाने वाले प्रकार के सदस्य ऑफसेट की गणना करने के लिए मैक्रो कार्यान्वयन में से एक से एक उदाहरण स्निपेट है जहां क्लास प्रदान किया जाता है।
(ptrType_t)&reinterpret_cast<ptrType_t&>((reinterpret_cast<CLASS*>(0))->member)
प्रतिबिंब
प्रतिबिंब के साथ सबसे बड़ी समस्या के बारे में एक सामान्य चेतावनी है कि यह कैसे शक्तिशाली हो सकता है। प्रतिबिंब के बहुत अधिक असंगत उपयोग के साथ आप आसानी से एक आसानी से बनाए रखने योग्य कोडबेस को एक विशाल गड़बड़ में बदल सकते हैं।
मैं व्यक्तिगत रूप से निचले स्तर के सिस्टम (मुख्य रूप से क्रमबद्धता) के लिए प्रतिबिंब आरक्षित करता हूं और व्यापार तर्क के लिए रनटाइम प्रकार की जांच के लिए इसका उपयोग करने से बचता हूं। वर्चुअल फ़ंक्शंस जैसे भाषा संरचनाओं के साथ गतिशील प्रेषण प्रतिबिंब प्रकार चेक सशर्त कूदों को प्राथमिकता दी जानी चाहिए।
समस्याएं ट्रैक करने में भी मुश्किल होती हैं अगर भाषा का उत्तराधिकारी है या प्रतिबिंब के लिए कुछ भी समर्थन नहीं है। सी # में उदाहरण के लिए आप एक यादृच्छिक कोडबेस दिया गया है, यह गारंटी नहीं दे सकता कि कंपाइलर को किसी भी उपयोग के बारे में आपको सतर्क करने की अनुमति देकर फ़ंक्शन का उपयोग नहीं किया जा रहा है। न केवल आप कोडबेस से स्ट्रिंग के माध्यम से विधि का आह्वान कर सकते हैं या नेटवर्क पैकेट से कह सकते हैं ... आप लक्ष्य असेंबली पर प्रतिबिंबित कुछ अन्य असंबंधित असेंबली की एबीआई संगतता भी तोड़ सकते हैं। तो फिर लगातार और कम से कम प्रतिबिंब का उपयोग करें।
निष्कर्ष
वर्तमान में है सी ++ में एक serializable वर्ग पदानुक्रम के आम प्रतिमान करने के लिए कोई मानक बराबर है, लेकिन यह ज्यादा किसी अन्य प्रणाली आप नए भाषाओं में देखने की तरह जोड़ा जा सकता है। आखिरकार सबकुछ सरल मशीन कोड के लिए अनुवाद करता है जिसे आपके सीपीयू मरने में शामिल ट्रांजिस्टर की अविश्वसनीय सरणी की बाइनरी स्थिति द्वारा दर्शाया जा सकता है।
मैं यह नहीं कह रहा हूं कि हर किसी को किसी भी तरह से अपना खुद का रोल करना चाहिए। यह जटिल और त्रुटि प्रवण काम है। मुझे बस इस विचार को बहुत पसंद आया और वैसे भी इस तरह की चीज में दिलचस्पी रही है। मुझे यकीन है कि इस तरह के काम के लिए लोग कुछ मानक फॉलबैक उपयोग करते हैं। जैसा आपने ऊपर बताया है, सी ++ की तलाश करने वाला पहला स्थान boost होगा।
यदि आप "सी ++ प्रतिबिंब" की खोज करते हैं तो आप कई उदाहरण देखेंगे कि दूसरों को एक समान परिणाम कैसे प्राप्त होता है।
एक त्वरित खोज this को एक उदाहरण के रूप में खींच लिया गया।
सी ++ मानक पुस्तकालय से कोई नहीं है। अन्य पुस्तकालयों (जैसे एमएफसी मुझे पता है) को क्रमबद्ध करने के लिए समर्थन हो सकता है। एक्सएमएल, जेएसओएन इत्यादि के लिए सीरियलाइजेशन लाइब्रेरीज़ हैं, हालांकि। – Ajay
यह काफी नहीं है कि आप क्या पूछ रहे हैं, लेकिन आमतौर पर सी ++ में क्या किया जाता है (और आमतौर पर काफी व्यावहारिक साबित होता है), [बूस्ट] (http://www.boost.org/doc/libs/1_61_0/libs/ serialization/डॉक्टर /) एक नजर लायक है। –
मैं मूल रूप से भाषा स्तर जावा सुविधा के सी ++ समकक्ष की तलाश नहीं करता हूं लेकिन सी ++ में सीरियलाइजेशन को आम तौर पर कैसे संभाला जाता है इस पर ध्यान केंद्रित करता हूं। मानक दृष्टिकोण समान हो सकते हैं लेकिन जरूरी नहीं है - सी ++ और जावा के पास एक अलग मेमोरी मॉडल इत्यादि है। – Thomas