मुझे कुछ सदस्यों के साथ एक संरचना मिली है जो मैं एक स्ट्रिंग से प्राप्त करने और सेट करने में सक्षम होना चाहता हूं। यह देखते हुए कि सी ++ किसी भी आत्मनिरीक्षण मैं समझ मैं मैक्रो के साथ कुछ रचनात्मक समाधान की जरूरत है, stringize ऑपरेटर और शायद boost::bind.
मैं पूरी क्रमबद्धता या आत्मनिरीक्षण की जरूरत नहीं है, और अधिक एक 'आत्मनिरीक्षण-लाइट' नहीं हैस्ट्रिंग प्रस्तुतियों से सी/सी ++ सदस्य चर सेट करने का कोई अच्छा तरीका है? (आत्मनिरीक्षण-लाइट)
मैं चाहूँगा इस की तर्ज पर कुछ है करने के लिए:
struct MyType {
int fieldA;
int fieldB;
};
DECLARE_STRING_MAP(MyType,fieldA);
DECLARE_STRING_MAP(MyType,fieldB);
MyType t;
SET_VALUE_FROM_STRING(MyType,t,"fieldA","3")
के बजाय एक विशाल if
बयान की है।
कोई विचार अगर इस के लिए एक साफ समाधान है?
संबंधित प्रश्न: Object Reflection
संपादित करें: 'प्रकार int :: * नक्शा' चाल के लिए maxim1000 को धन्यवाद - यह मेरे लिए काम किया:
#define DEFINE_LOOKUP_MAP(Type) std::map<AnsiString,int Type::*> mapper
#define ADD_FIELD_MAPPING(Type, Field) mapper[#Field]=&Type::Field
#define SET_FIELD_FROM_MAP(Type, Field, var, value) var.*(mapper[#Field])=value
DEFINE_LOOKUP_MAP(MyType);
ADD_FIELD_MAPPING(MyType, fieldA);
ADD_FIELD_MAPPING(MyType, fieldB);
SET_FIELD_FROM_MAP(MyType, fieldA, obj, 3);
मुझे लगता है कि आप SET_VALUE_FROM_STRING लिखने के लिए (MyType चाहते हैं, टी , currentAttr, "3") साथ ही? –
बढ़ावा :: lexical_cast भी उपयोगी हो सकता है। –
@Matthieu: हाँ, तीसरा तर्क एक स्ट्रिंग वैरिएबल हो सकता है, उदाहरण के लिए, मैं 'फ़ील्ड ए = 3, फ़ील्डबी = 10'' फॉर्म के कुछ पाठ को पार्स कर सकता हूं और इस फ़ंक्शन में कॉल कर सकता हूं @ltcmelo - yes, 'lexical_cast' टाइप रूपांतरण के लिए उपयोगी हो, लेकिन चलिए इस पल के लिए मान लें कि मुझे पता है कि मान हमेशा इंट्स होने जा रहे हैं। –