कल्पना कीजिए कि हमारे पास सैकड़ों संदेश प्रकारों के साथ कुछ प्रकार का प्रोटोकॉल है, जिनमें से प्रत्येक हम एक सी ++ वर्ग द्वारा मॉडल करना चाहते हैं। के बाद से प्रत्येक वर्ग के स्वचालित रूप से प्रत्येक क्षेत्र पर कार्रवाई करने के लिए सक्षम होना चाहिए, एक प्राकृतिक समाधान सिर्फ सभी आवश्यक प्रकार के साथ एक std::tuple
है:"एनोटेटेड" फ़ील्ड वाले क्लास को कैसे डिज़ाइन किया जाए?
std::tuple<int, double, char> message;
print(message); // the usual variadic magic
यह सब ठीक है और अच्छी तरह से है। हालांकि, अब मैं प्रत्येक फ़ील्ड को एक नाम देना चाहता हूं, और मैं अपने कोड में फ़ील्ड का जिक्र करते समय नाम का उपयोग करने में सक्षम होना चाहता हूं, साथ ही इसके पाठ का प्रतिनिधित्व भी प्राप्त करना चाहता हूं। भोलेपन से, या सी में, मैं लिखा है हो सकता है:
struct Message
{
int header;
double temperature;
char flag;
};
इस तरह हम टपल की पुनरावर्ती automagic प्रसंस्करण शक्ति खो देते हैं, लेकिन हम प्रत्येक क्षेत्र सचमुच नाम कर सकते हैं। सी ++ में, हम एक enum के माध्यम से दोनों कर सकते हैं:
struct Message
{
enum FieldID { header, temperature, flag };
static const char * FieldNames[] = { "header", "temperature", "flag" };
typedef std::tuple<int, double, char> tuple_type;
template <FieldID I>
typename std::tuple_element<I, tuple_type>::type & get()
{ return std::get<I>(data); }
template <FieldID I>
static const char * name() { return FieldNames[I]; }
tuple_type data;
};
अब मैं कह सकता हूँ, Message m; m.get<Message::header>() = 12;
आदि, और मैं क्षेत्रों पर recurse और प्रत्येक प्रिंट आउट अपने स्वयं के मूल्य अपने खुद के नाम से उपसर्ग कर सकते हैं, आदि
अब सवाल: मैं ऐसे कोड कैसे लेखक कर सकते हैं कुशलतापूर्वक, बिना दोहराव के?
START_MESSAGE(Message)
ADDFIELD(int, header)
ADDFIELD(double, temperature)
ADDFIELD(char, flag)
END_MESSAGE
वहाँ कोई तरीका है, बाहरी पीढ़ी उपकरण की आवश्यकता के बिना पूर्वप्रक्रमक, बूस्ट और सी ++ 11, कुछ इस तरह प्राप्त करने के लिए संयोजन:
आदर्श रूप में, मैं यह कहना सक्षम होना चाहते हैं ? (मुझे लगता है कि बूस्ट.प्रप्रोसेसर इस "क्षैतिज" और "लंबवत" पुनरावृत्ति को बुलाता है। मुझे किसी भी तरह से डेटा डेटा को "ट्रांसफर" करने की आवश्यकता है।) यहां मुख्य विशेषता यह है कि मुझे कभी भी किसी भी जानकारी को दोहराना नहीं पड़ता है, और यह संशोधित या जोड़ना एक फ़ील्ड को केवल एक ही बदलाव की आवश्यकता होती है।
समस्याओं के इस प्रकार, एक साधारण वर्णनात्मक भाषा और एक कस्टम पूर्वप्रक्रमक एक फ़ाइल को शामिल पैदा करने के लिए यहाँ है कि मैं क्या के साथ आया है लंबे समय तक सबसे अच्छा है। "स्रोत फ़ाइल" आसानी से रखरखाव योग्य है, और बाहरी उपकरणों द्वारा भी उत्पन्न किया जा सकता है, परियोजना को इसकी आवश्यकता होनी चाहिए। –
@AlexandreC .: किसी दिए गए चरण में, "केवल एक और छोटा टूल" हमेशा अच्छे जवाब की तरह दिखता है। लेकिन चीजों की भव्य योजना में, आपके पास बस ले जाने और बनाए रखने और दस्तावेजों को याद रखने और उन्हें प्रशिक्षित करने के लिए एक और चीज है। बॉक्स से बाहर काम करने वाली कुछ चीज निश्चित रूप से कुछ भयानक मैक्रोज़ स्थापित करने के दर्द के लायक है। –