2011-02-15 17 views
5

मैं बूट की property_tree लाइब्रेरी का उपयोग कर रहा हूं। मैं ptree ऑब्जेक्ट से एक बच्चे नोड प्राप्त करने का एक तरीका ढूंढ रहा हूं, लेकिन असफल होने पर खाली ptree लौटाएं। मैं property_tree/उदाहरण/empty_ptree_trick.cpp में एक अच्छा उदाहरण भर में आया था:बूस्ट property_tree :: empty_ptree कहाँ है?

void process_settings(const std::string &filename) 
{ 
    ptree pt; 
    read_info(filename, pt);  
    const ptree &settings = pt.get_child("settings", empty_ptree<ptree>()); 
    std::cout << "\n Processing " << filename << std::endl; 
    std::cout << "  Setting 1 is " << settings.get("setting1", 0) << std::endl; 
    std::cout << "  Setting 2 is " << settings.get("setting2", 0.0) << std::endl; 
    std::cout << "  Setting 3 is " << settings.get("setting3", "default") <<  std::endl; 
} 

जो करता है मैं वास्तव में क्या जरूरत है। समस्या यह है कि संकलक शिकायत करता है कि empty_ptree() फ़ंक्शन boost:property_tree का सदस्य नहीं है। कोई विचार जहां empty_ptree() है?

मैं वीएस -2010 पर बूस्ट 1.44 का उपयोग कर रहा हूं।

उत्तर

1

मैंने अभी उस प्रश्न का उत्तर देने का प्रयास कर पूरे दिन उड़ा दिया है!

यह मेरा समाधान था। सबसे पहले मैंने पॉइंटर्स का इस्तेमाल किया, और संदर्भ नहीं, क्योंकि आपको तुरंत उन्हें प्रारंभ करना होगा। तब मैंने अपवाद पकड़ा और एक नया ptree जोड़ा।

using namespace boost::property_tree; 

ptree r_pt; 
ptree *c_pt; 

read_xml("file.xml" , r_pt); 

try { 
    c_pt = &(r_pt.get_child("example")); 
} 
catch (ptree_bad_path) { 
    c_pt = &(r_pt.put_child("example", ptree())); 
} 

std::cout << "Setting 1 is " << c_pt.get("setting1", 0) << std::endl; 

जो मैं उठा सकता हूं उससे वे उम्मीद करते हैं कि हम बूस्ट :: वैकल्पिक प्रकार का उपयोग करें। लेकिन मैं सिर्फ एक शुरुआत कर रहा हूँ ..

संपादित मैं सिर्फ empty_ptree < के कार्यान्वयन पाया>।

template<class Ptree> 
    inline const Ptree &empty_ptree() 
    { 
     static Ptree pt; 
     return pt; 
    } 

मैं तुम्हें सिर्फ अपने कोड से जोड़ें और empty_ptree_trick.cpp में वर्णित के रूप में उपयोग कर सकते लगता है, लेकिन मैं अब तक मुझे पता है कि कैसे अपने वास्तव में किया जाना चाहिए के लिए अपने समाधान के साथ चिपके हुए कर रहा हूँ।

+0

@expelleboy - प्रयास के लिए धन्यवाद :-)। हालांकि, आपके सुझाए गए कोड के साथ कुछ समस्याएं हैं: 1) 'read_xml' भी फेंक सकता है - ताकि आप इसे 'try' block में डाल सकें। 2) मुझे यकीन नहीं है कि 'get_child' द्वारा लौटी गई पीटीआरई का जीवनकाल क्या है, हालांकि, बढ़ावा देने के उदाहरण हमेशा परिणाम प्राप्त करते हैं <>, और अपना पता कभी नहीं लेते हैं। आप एक खतरनाक सूचक के साथ समाप्त हो सकता है। 3) आप 'try-catch 'को छोड़ सकते हैं, जैसा कि प्राप्त करने के वैकल्पिक संस्करण <> (आपके कैच ब्लॉक में उपयोग किया जाता है), कभी फेंकता नहीं है। 4) इसे बनाने के बजाय खाली_प्ट्री के संदर्भ को वापस करने के लिए यह अधिक कुशल है। – bavaza

+0

@bavaza एनपी। असल में मैंने इन मुद्दों का सामना किया था (कक्षा में xml_branch) जो मुझे विरासत में मिला था, जो मुझे केवल एक वर्ग के भीतर उदाहरण बनाने के लिए मजबूर करता है जो xml_branch, या एक पॉइंटर को पीटीआरआई में प्राप्त करता है। रूट वर्ग में वास्तविक ptree और इसके सूचक हैं। फिर रूट सदस्य xml_branch के प्रारंभिकरण पर उठाए गए सभी अपवादों को संभालता है। दुर्भाग्य से मैं आपको पूरा स्रोत नहीं दिखा सकता, लेकिन मैं इसे करने का एक शानदार तरीका कह सकता हूं। – expelledboy

+0

क्षमा करें, मेरा कहना है कि "शाखा सभी अपवादों को नियंत्रित करती है ...", लेकिन मैं अपनी टिप्पणी संपादित नहीं कर सकता .. – expelledboy

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