c++ - How to implement user friendly accessors -
मैं बस कोड पोस्ट करूंगा:
#include & lt; tuple & gt; नामस्थान प्राथमिक_प्रोचोल {नामस्थान {typedef uint64_t फ़ील्ड_id_t; Typedef uint64_t field_size_t; Typedef uint64_t msg_id_t; Typedef uint64_t msg_size_t; } Struct field_header {field_id_t _id; Field_size_t _size; }; स्थैतिक const आकार_t field_header_sz = sizeof (field_header); टेम्पलेट & lt; वर्ग TFieldType, field_id_t id & gt; संरचना क्षेत्र {निजी: सार्वजनिक: फ़ील्ड_id_t _id = id; Field_size_t _size = sizeof (* यह); TFieldType _value; }; Struct message_header {msg_id_t _id; Msg_size_t _size; }; स्थैतिक const size_t msg_header_sz = sizeof (message_header); टेम्पलेट & lt; msg_id_t msg_id, वर्ग ... TFields & gt; संरचना संदेश {msg_id_t _id; Msg_size_t _size = sizeof (* यह); std :: टपल & LT; TFields ... & gt; खेत; }; } नामस्थान प्रभाव {typedef uint64_t फ़ील्ड_id_t; Typedef uint64_t msg_id_t; स्थैतिक const size_t field_name_sz = 256; स्थैतिक const size_t msg_name_sz = 256; टाइपिंग प्राइमरी_प्रोटोकल :: फ़ील्ड & lt; field_id_t, 0 & gt; field_id_field_t; Typedef प्राथमिक_प्रोक्ति :: फ़ील्ड & lt; char [field_name_sz], 1 & gt; field_name_field_t; Typedef primary_protocol :: फ़ील्ड & lt; msg_id_t, 2 & gt; msg_id_field_t; Typedef प्राथमिक_प्रोक्ति :: फ़ील्ड & lt; चार [msg_name_sz], 3 & gt; msg_name_field_t; Typedef प्राथमिक_प्रोतिलोक :: संदेश & lt; 0, field_id_field_t, field_name_field_t & gt; field_definition_msg_t; Typedef प्राथमिक_प्रोतिलोक :: संदेश & lt; 1, msg_id_field_t, msg_name_field_t & gt; msg_declaration_msg_t; } #include & lt; iostream & gt; #include & lt; string.h & gt; नेमस्पेस एसटीडी का उपयोग करना; Int main (int argc, char ** argv) {impl :: field_definition_msg_t field_def_msg; Std :: मिल & lt; 0 & gt; (field_def_msg.fields) ._ value = 10; Strcpy (std :: get & lt; 1 & gt; (field_def_msg.fields) ._ मान, "हैलो"); Cout & lt; & lt; Std :: मिल & lt; 0 & gt; (field_def_msg.fields) ._ मान & lt; & lt; एंडएल & lt; & lt; Std :: get & lt; 1 & gt; (field_def_msg.fields) ._ मान & lt; & lt; endl; }
मेरी समस्या प्रपत्र std :: get & lt; 0 & gt; (field_def_msg.fields) के मुख्य फ़ंक्शन में एक्सेसर्स है ._ value = 10
। क्या field_ref & lt; field_id_field_t & gt; (field_def_msg) = 10
को tuple
में प्रत्येक प्रकार को संभालने के लिए अद्वितीय है? (इसके अलावा, यदि वे अद्वितीय नहीं हैं, तो n
th क्षेत्र प्रकार field_id_field_t
प्राप्त करने के लिए field_ref & lt; field_id_field_t, n & gt;
जैसा कुछ भी) />
जैसा कि टिप्पणियों में बताया गया है, आप सी ++ 14 ओवरलोड की तलाश कर रहे हैं। एक सरल समतुल्य कार्यान्वयन (सी ++ 11 के लिए) इस तरह दिखता है:
टेम्पलेट & lt; typename T, std :: size_t काउंटर = 0, टाइपनाम ... A & gt; ढालना find_; टेम्पलेट & lt; typename T, typename एफ, टाइपनाम ... टेल, std :: size_t काउंटर & gt; स्ट्रैटेजिक खोज_ & lt; T, काउंटर, एफ, टेल ... & gt; : Find_ & lt; T, काउंटर + 1, टेल ... & gt; {}; टेम्पलेट & lt; typename टी, typename ... टेल, std :: size_t काउंटर & gt; स्ट्रैटेजिक खोज_ & lt; T, काउंटर, टी, टेल ... & gt; : Std :: integral_constant & lt; std :: size_t, काउंटर & gt; {}; टेम्पलेट & lt; typename टी, टाइपनाम ... Args & gt; Find = find_ & lt; T, 0, Args ... & gt ;; का उपयोग करके टेम्पलेट के & lt; वर्ग टी, कक्षा ... प्रकार & gt; Constexpr टी एंड amp; (स्टड :: ट्यूपल एंड लेफ्टिनेंट; प्रकार ... & gt; & amp; amp; टी) {वापसी std :: get & lt; खोजें & lt; T, प्रकार ... & gt; :: मूल्य & gt; (std :: move (t)); } टेम्पलेट & lt; वर्ग टी, कक्षा ... प्रकार & gt; Constexpr टी const & amp; (स्टड :: ट्यूपल एंड लेफ्टिनेंट; प्रकार ... & gt; कॉन्टी & amp; टी) {return std :: get & lt; खोज & lt; T, प्रकार ... & gt; :: मूल्य & gt; (टी); } टेम्पलेट & lt; वर्ग टी, कक्षा ... प्रकार & gt; Constexpr टी एंड amp; {Std :: tuple & lt; प्रकार ... & gt; & amp; t} {वापस std :: get & lt; खोज & lt; T, प्रकार ... & gt; :: मूल्य & gt; (टी); }
ध्यान दें कि यह संकलन करने में विफल नहीं है अगर ट्यूपल
इसमें एक से अधिक बार शामिल होता है - यह उस प्रकार का पहला ऑब्जेक्ट उठाता है।
Comments
Post a Comment