2011-09-27 9 views

Odpowiedz

37
optional< const ptree& > child = node.get_child_optional("possibly_missing_node"); 
if(!child) 
{ 
    // child node is missing 
} 
+0

aby uzyskać przykład do pracy musiałem wyjąć „const” - mógłbyś wyjaśnić, dlaczego używasz „const "tutaj? – serup

+0

Dla bezpieczeństwa. Podczas odczytu konfiguracji może istnieć niewielki powód do modyfikacji wartości. Szybkie wyszukiwanie pokazuje, że ptree wciąż ma (w wersji 1.61.0) przeciążenie get_child_optional, które zwraca opcjonalne , więc Twój błąd będzie związany z tym, co zrobisz z wartością później. – RobH

17

Oto kilka innych alternatyw:

if(node.count("possibliy_missing") == 0) 
{ 
    ... 
} 

ptree::const_assoc_iterator it = ptree.find("possibly_missing"); 
if(it == ptree.not_found()) 
{ 
    ... 
} 
+1

Podoba mi się drugi ... bardziej stylowy styl – anhoppe

+1

Uważam, że warto zauważyć, że w przeciwieństwie do metody get <> metoda find nie zapewnia obsługi find ("SubNode.Attribute"). Musisz ręcznie pobrać dziecko SubNode w ptree i uruchomić find na instancji podrzędnej, – anhoppe

+0

dziwnie node.count nie działa dla mnie, nawet jeśli jest tam ... –

1

ile rozwiązania te mogą pojawić się uniknąć Iterowanie nad drzewem, po prostu pamiętać, że pod kołdrą nadal są one dokładnie to robi, więc Czynią twój algorytm potencjalnie n^2 ... jeśli martwisz się wydajnością i pamięcią do stracenia, możesz użyć kontenera mapy do szybkiego wyszukiwania.

+0

2n zamiast n^2 faktycznie: D. Który wciąż jest w końcu ... – Ioanna

+0

brzmi interesująco - może mógłbyś napisać mały przykład tego? – serup

5

Dołącz następująco:

#include <boost/optional/optional.hpp> 

Zdjąć const:

boost::optional< ptree& > child = node.get_child_optional("possibly_missing_node"); 
if(!child) 
{ 
    // child node is missing 
} 
+5

Gdy twoja odpowiedź jest ważna, skopiowałeś większość innej odpowiedzi (bez ujawnienia!), Która została przyjęta i prawie 3 lata. Czy możesz przynajmniej wyjaśnić, dlaczego dokonałeś zmian? Prawdopodobnie lepiej służył jako komentarz. – Avery

+0

Głosowałem za tobą, ponieważ nie dodajesz do rozwiązania - być może, gdybyś zmienił coś więcej niż tylko usunięcie const, to bym wybrał głosowanie – serup

Powiązane problemy