2012-12-15 11 views
6

क्या किसी भी संरचना या वर्ग को टुपल में बदलने के लिए टेम्पलेट मेटा-प्रोग्रामिंग का उपयोग करना संभव है?टीएमपी: टेम्पलेट कोड कैसे लिखना है जो किसी भी संरचना को टुपल में परिवर्तित करता है?

उदाहरण के लिए:

struct Foo 
{ 
    char   c; 
    int   i; 
    std::string s; 
}; 

typedef std::tuple< char, int, std::string > Foo_Tuple; 

यह कुछ टेम्पलेट कोड है जो पूर्ण रूप से अपने मेरे लिए Foo_Tuple उत्पन्न होगा करने के लिए अच्छा होगा।

उत्तर

यह इस तरह के एक सरल मामले के लिए overkill है, लेकिन और अधिक व्यापक मामलों (जैसे ORM या किसी भी समय के लिए आप बॉयलर-प्लेट कोड का एक बहुत कुछ लिखने के लिए की जरूरत है, और एक मात्र टेम्पलेट या मैक्रो है कार्य के लिए अपर्याप्त), Boost Mirror ऐसा लगता है कि यह बेहद उपयोगी हो सकता है। मैंने बूस्ट मिरर में थोड़ा और खोला है: मूल प्रतिबिंब कार्यक्षमता (मिरर और पुडल में) को समझना मुश्किल नहीं है, सेट अप करने में काफी आसान है और काफी व्यापक प्रतीत होता है (सी ++ 11 सहित कई संरचनाओं को संभाल सकता है enum कक्षाओं, आदि ...)। मुझे यह बुनियादी कार्यक्षमता पर्याप्त से अधिक होने के लिए मिलती है - मैं केवल मैक्रो का उपयोग इस हद तक कर सकता हूं कि मैं अपनी कक्षाओं को प्रतिबिंब में प्रकट करना चाहता हूं (ताकि मुझे बॉयलर-प्लेट कोड लिखना न पड़े)। फैक्टरी जनरेटर भी बहुत शक्तिशाली प्रतीत होते हैं (उसी प्रारंभिक मैक्रोज़ सेट अप के साथ, आप किसी भी फैक्ट्री जनरेटर में स्वैप कर सकते हैं जिसे आप JSON, SOCI, या स्ट्रीम आदि को आउटपुट करना चाहते हैं ...), लेकिन इसमें एक बड़ा सीखने की वक्र/सेटअप, अगर आप अपने कारखाने जेनरेटर लिखना चाहते हैं। नोट्स के आखिरी जोड़े: कुछ मामूली बदलावों के साथ, मैं इसे सीसीसी +7 के साथ जीसीसी 4.7.2 पर काम करने में सक्षम था; भी, दस्तावेज़ीकरण अच्छी तरह से किया गया है और जल्दी से जाने के लिए पर्याप्त उदाहरणों से अधिक प्रतीत होता है।

+0

'std :: टपल ' hehe – Pubby

+0

मैं जानता हूँ कि मैं जोर से यह सुझाव देने के लिए निंदा की हो जाएगा, लेकिन मैं इस मामले 'reinterpret_cast' सबसे प्लेटफार्मों पर काम करने वाला लगता है:

यहाँ ऐसे ही एक लेख है। –

+1

@ जेम्स ब्रॉक बू! फुफकार! [आपका सुझाव बुरा है और आपको बुरा महसूस करना चाहिए] (http://www.youtube.com/watch?v=jG2KMkQLZmI)! –

उत्तर

6

मुझे नहीं लगता कि सी ++ में ऐसा करने का कोई तरीका है।

मुझे संरचना में फ़ील्ड/प्रकारों की गणना करने का कोई तरीका नहीं पता - यदि आप ऐसा कर सकते हैं, तो मुझे लगता है कि इस तरह के ट्यूपल का निर्माण काफी सरल होगा।

मुझे विश्वास है कि बूस्ट.फ्यूजन में एक मैक्रो है जो इसे FUSION_ADAPT_STRUCT नामक मदद करता है, लेकिन यह सब मैनुअल है।

इसके लिए तकनीकी शब्द "प्रतिबिंब" है, और आप "सी ++ प्रतिबिंब" की खोज करके इसके बारे में बहुत सारी जानकारी पा सकते हैं। How can I add reflection to a C++ application?

+0

अंतर्दृष्टि के लिए +1 और उपयोगी लिंक – kfmfe04

+0

ऐसा लगता है जब तक सी ++ प्रतिबिंब नहीं मिलता है, इनमें से कुछ पुस्तकालय करेंगे (कम से कम यह बॉयलरप्लेट कोड को रोक देगा)। – kfmfe04

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

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