इसके बजाय दृढ़ता से कितने माता-पिता यह है, एक वृक्ष संरचना के रूप में अपने कोड का आयोजन के आधार पर प्रत्येक नोड टाइप करने के लिए कोशिश कर के
:
class Element
{
public:
std::string Name;
std::map<std::string, std::string, std::less<std::string> > Attributes;
std::list<Element> Children;
};
आपकी सार्वजनिक इंटरफ़ेस शायद इस से अलग दिखेगा। मैं बस सामान्य प्रकार के लेआउट दिखाने की कोशिश कर रहा हूं।
आपको वास्तव में नोड या विशेषता सुविधाओं की आवश्यकता नहीं है, जब तक कि आपको तत्वों के साथ संग्रह में उन्हें पुन: सक्रिय करने की आवश्यकता न हो। यह एक्सएमएल डोम पुस्तकालयों के लिए एक उपयोगी विशेषता है, लेकिन यदि आप केवल डेटा संरचना बनाने की कोशिश कर रहे हैं, तो आपको पत्र में डीओएम डिज़ाइन का पालन करने की आवश्यकता नहीं है।
#include<map>
#include<string>
#include<iostream>
class PropertyBag;
typedef std::map<std::string, PropertyBag> PropertyMap;
class PropertyBag : public PropertyMap
{
public:
PropertyBag(const std::string& value)
: value(value)
{
}
PropertyBag& operator=(const std::string& value)
{
this->value = value;
return *this;
}
operator std::string&() { return value; }
private:
std::string value;
friend PropertyMap::mapped_type& PropertyMap::operator[](const PropertyMap::key_type&);
PropertyBag() { }
};
void SomeFunction(const std::string& value)
{
std::cout << value << "\n";
}
int main(int argc, char* argv[])
{
PropertyBag config("configuration root");
config["child1"] = "value1";
config["child1"]["subchild1"] = "value2";
SomeFunction(config["child1"]);
SomeFunction(config["child1"]["subchild1"]);
return 0;
}
बस वाक्य रचना के बारे में बात, आप भी operator()
अधिक भार के साथ मुश्किल प्राप्त करने की कोशिश कर सकते हैं:
वास्तव में, यदि आप सिर्फ एक सामान्य डेटा संरचना के लिए जा रहे हैं, तो आप सिर्फ एक संपत्ति बैग चाहते हो सकता है , और/या चेनिंग तरीके:
PropertyBag& SomeMethod(const std::string& someParam)
{
// do something here...
return *this;
}
PropertyBag& operator()(const std::string& p1, const std::string& p2)
{
// ...
return *this;
}
// ...
Configuration config1("root")
.SomeMethod("p1")
.SomeMethod("p2");
Configuration config2("root")
("Something", "blah")
("sizzle", "V2");
मैं कम पाठ/कोड दोहराव, बेहतर कल्पना। जितना अधिक आप अपने कोड को JSON या YAML जैसे वाक्यविन्यास के लिए प्राप्त कर सकते हैं, उतना ही बेहतर।
एक बार सी ++ 0x बाहर निकलने के बाद, आपके पास बहुत आसान विकल्प उपलब्ध हो सकते हैं।आप अपनी डेटा संरचना पर उपयोग करने के लिए एक आसान प्रारंभिक वाक्यविन्यास के लिए boost::assign library पर भी देख सकते हैं।
आप एक डेटाटाइप के लिए boost::any library पर भी देख सकते हैं, जिसे आप स्ट्रिंग्स के बजाय मूल्य के रूप में उपयोग कर सकते हैं (किसी भी मूल्य को डालने के प्रकार-सुरक्षित विधि का समर्थन करता है, जब तक आप इसे उसी प्रकार के रूप में निकालें)।
+1, अब मैं प्रश्न को बेहतर समझता हूं। मैंने सोचा था कि आप एक एक्सएमएल लाइब्रेरी को कार्यान्वित करने की कोशिश कर रहे थे :) –