संलयन एक दृष्टिकोण है, लेकिन क्यों
यानी
struct generic
{
std::map<std::string, boost::variant<foo, bar, bob, int, double> > _impl;
};
एक std::map
एक std::string
, जहां पेलोड boost::variant
है द्वारा keyed में अपने "फील्ड" की दुकान नहीं ... और फिर आप कर सकते हैं बस अपने गेटर/सेटर में कुंजी को देखो ...
हेक, variant
को optional
में लपेटें और आपके पास वैकल्पिक फ़ील्ड हो सकते हैं!
एक अधिक जटिल उदाहरण:
class foo
{
public:
typedef boost::variant<int, double, float, string> f_t;
typedef boost::optional<f_t&> return_value;
typedef map<string, return_value> ref_map_t;
foo() : f1(int()), f2(double()), f3(float()), f4(string()), f5(int())
{
// save the references..
_refs["f1"] = return_value(f1);
_refs["f2"] = return_value(f2);
_refs["f3"] = return_value(f3);
_refs["f4"] = return_value(f4);
_refs["f5"] = return_value(f5);
}
int getf1() const { return boost::get<int>(f1); }
double getf2() const { return boost::get<double>(f2); }
float getf3() const { return boost::get<float>(f3); }
string const& getf4() const { return boost::get<string>(f4); }
int getf5() const { return boost::get<int>(f5); }
// and setters..
void setf1(int v) { f1 = v; }
void setf2(double v) { f2 = v; }
void setf3(float v) { f3 = v; }
void setf4(std::string const& v) { f4 = v; }
void setf5(int v) { f5 = v; }
// key based
return_value get(string const& key)
{
ref_map_t::iterator it = _refs.find(key);
if (it != _refs.end())
return it->second;
return return_value();
}
template <typename VT>
void set(string const& key, VT const& v)
{
ref_map_t::iterator it = _refs.find(key);
if (it != _refs.end())
*(it->second) = v;
}
private:
f_t f1;
f_t f2;
f_t f3;
f_t f4;
f_t f5;
ref_map_t _refs;
};
int main(void)
{
foo fancy;
fancy.setf1(1);
cout << "f1: " << fancy.getf1() << endl;
fancy.set("f1", 10);
cout << "f1: " << fancy.getf1() << endl;
return 0;
}
मुझे आश्चर्य है कि आप यह क्यों चाहते हैं? यहां तक कि उन भाषाओं में भी जो सीधे इसका समर्थन करते हैं, प्रतिबिंब एक हैक है जो खराब कोड, या आलसी प्रोग्रामर के लिए सस्ता कोड प्राप्त करने के लिए उपयोग किया जाता है। –
आप टाइप-सुरक्षा सी ++ को हरा रहे हैं आपको देता है। पृथ्वी पर क्या अनिश्चितता प्राप्त करने के लिए एक गन्दा हैक के साथ शुद्धता के लिए इस तरह के एक सरल, मजबूत उपकरण का आदान-प्रदान करने का औचित्य साबित कर सकता है? – wilhelmtell
@ विल्हेल्मटेल: मैं सही संतुलन खोजने की कोशिश कर रहा हूं। मैं एक बहुत ही अनिश्चित स्रोत से मूल्य पढ़ रहा हूं, और उन्हें एक सामान्य तरीके से पार्स और संभालने की आवश्यकता है। केवल उनमें से एक छोटे से हिस्से के लिए मुझे सही प्रकार पता है (और जानना चाहते हैं)। –