2012-02-27 14 views
6

द्वारा विशेषता प्राप्त करें मैं किसी समस्या के लिए एक और पेशेवर समाधान के लिए सोच रहा हूं। मैं सी ++ SOAP2 solution.I पर काम कर रहा हूँ के बारे में 25 तत्वोंसी ++ स्ट्रक्चर: नाम

struct X { field 1; field 2; .. };  

के Strcut defintion है और मैं इसे भरने के लिए कुछ नक्शे के साथ महत्व देता

Map<String,String> A  

tring हूँ और ऐसा लगता है ऐसी चीज करने के लिए बहुत परेशान होना n12

X->xx = A["aaa"]  

हर बार जब मैं अपनी एसओएपी संदेश संरचना को भरना चाहता हूं।

प्रश्न: क्या नाम से संरचना तत्व को कॉल करना संभव है? * उदाहरण: इस तरह कार्रवाई करने के लिए अबे होने के लिए:

X->get_instance_of("xx").set(A["aaa"]);  

और यह एक पाश में डाल दिया .. *

धन्यवाद,

+0

एक ही प्रकार के सभी सदस्य हैं? – dasblinkenlight

+0

क्या लूप के माध्यम से? समाधान कुछ बाइंडिंग स्थापित करना होगा, लेकिन यह जानना मुश्किल है क्योंकि आपने पर्याप्त जानकारी नहीं दी है। – CashCow

+0

संरचना हमेशा एक ही है? और .. क्या फ़ील्ड समान हैं? –

उत्तर

1

नंबर सी ++ प्रतिबिंब नहीं है। जावा हालांकि करता है। अनजाने में, एसओए से संबंधित सामान शायद जावा जैसी भाषाओं के साथ सामना करना पड़ता है, जैसे सी

+1

यकीन नहीं है कि यह सच है। जावा में SOAP एपीआई संकलन चरण के रूप में कोड रैपर उत्पन्न करते हैं। सी ++ के लिए समान क्यों नहीं होना चाहिए? इसके लिए प्रतिबिंब का उपयोग करने की कोई आवश्यकता नहीं है। –

+0

यह निश्चित रूप से सदस्य पॉइंटर्स और फ़ंक्शन ओवरलोड के साथ सी ++ में भी किया जा सकता है। – Nawaz

+0

@ कोनराड्रूडॉल्फ [सी ++ मिडलवेयर राइटर] (http://webEbenezer.net) ऐसा करता है। –

1

ऐसा करना वास्तव में संभव नहीं है; आपको जो जानकारी चाहिए वह अब रनटाइम पर मौजूद नहीं है। आप map और कुछ पॉइंटर्स के साथ कुछ करने में सक्षम हो सकते हैं, लेकिन ईमानदार होने के लिए आप शायद इसे एक ऐसे फ़ंक्शन में लपेटने से बेहतर होंगे जो map लेता है और मानों को उपयुक्त फ़ील्ड में रखता है।

2

संक्षिप्त उत्तर: नहीं। यह सी ++ है, एक स्थिर रूप से संकलित भाषा है, जहां संरचना सदस्य नाम संकलक द्वारा मेमोरी ऑफसेट में परिवर्तित किए जाते हैं। यह PHP या पायथन की तरह गतिशील नहीं है जहां रनटाइम सभी परिवर्तनीय संदर्भों से जुड़ा हुआ है।

8

सी ++ में प्रतिबिंब अधिक गतिशील भाषाओं की क्षमताओं की कमी है, इसलिए आप वह नहीं कर सकते जो आप भाषा की बॉक्स क्षमताओं से बाहर कर सकते हैं।

हालांकि, अगर सभी सदस्य एक ही प्रकार के होते हैं, तो आप इसे सदस्यों के लिए संकेत का एक नक्शा और एक छोटे से तैयारी के साथ क्या कर सकते हैं:

// typedef for the pointer-to-member 
typedef int X::*ptr_attr; 

// Declare the map of pointers to members 
map<string,ptr_attr> mattr; 
// Add pointers to individual members one by one: 
mattr["xx"] = &X::xx; 
mattr["yy"] = &X::yy; 

// Now that you have an instance of x... 
X x; 
// you can access its members by pointers using the syntax below: 
x.*mattr["xx"] = A["aa"]; 
+2

भले ही वे अलग-अलग प्रकार हों, यह फ़ंक्शन ओवरलोडिंग के साथ किया जा सकता है। – Nawaz

+0

@ नवाज निश्चित, लेकिन इसके लिए एक पूरी तरह से अलग समाधान की आवश्यकता होगी।इसके अलावा, यह बहुत संभावना है कि इस तरह का समाधान मैंने प्रस्तावित की तुलना में अधिक सुरुचिपूर्ण होगा। – dasblinkenlight

+0

हां। ऐसा एक समाधान [@ जोहान्स शैब] (http://stackoverflow.com/users/34509/johannes-schaub-litb) द्वारा दिया गया है: http://stackoverflow.com/a/287353/415784 – Nawaz

0

आप सेट के साथ अपने struct के लिए एक आवरण objet बना सकते हैं/एक्सेसर्स प्राप्त करें जो आपको स्थिर अंतर्निहित संरचना को भरने/पढ़ने के लिए स्ट्रिंग मानों पर फिर से चलने देगा।

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