| // ---------------------------------------------------------------------------- |
| // Copyright (C) 2002-2006 Marcin Kalicinski |
| // |
| // Distributed under the Boost Software License, Version 1.0. |
| // (See accompanying file LICENSE_1_0.txt or copy at |
| // http://www.boost.org/LICENSE_1_0.txt) |
| // |
| // For more information, see www.boost.org |
| // ---------------------------------------------------------------------------- |
| |
| // This example shows what need to be done to customize data_type of ptree. |
| // |
| // It creates my_ptree type, which is a basic_ptree having boost::any as its data |
| // container (instead of std::string that standard ptree has). |
| |
| #include <boost/property_tree/ptree.hpp> |
| #include <boost/any.hpp> |
| #include <list> |
| #include <string> |
| #include <iostream> |
| |
| // Custom translator that works with boost::any instead of std::string |
| template <class Ext, class Int = boost::any> |
| struct variant_translator |
| { |
| typedef Ext external_type; |
| typedef Int internal_type; |
| |
| external_type |
| get_value(const internal_type &value) const |
| { |
| return boost::any_cast<external_type>(value); |
| } |
| internal_type |
| put_value(const external_type &value) const |
| { |
| return value; |
| } |
| }; |
| |
| int main() |
| { |
| |
| using namespace boost::property_tree; |
| |
| // Property_tree with boost::any as data type |
| // Key type: std::string |
| // Data type: boost::any |
| // Key comparison: default (std::less<std::string>) |
| typedef basic_ptree<std::string, boost::any> my_ptree; |
| my_ptree pt; |
| |
| // Put/get int value |
| typedef variant_translator<int> int_tran; |
| pt.put("int value", 3, int_tran()); |
| int int_value = pt.get<int>("int value", int_tran()); |
| std::cout << "Int value: " << int_value << "\n"; |
| |
| // Put/get string value |
| typedef variant_translator<std::string> string_tran; |
| pt.put<std::string>("string value", "foo bar", string_tran()); |
| std::string string_value = pt.get<std::string>( |
| "string value" |
| , string_tran() |
| ); |
| std::cout << "String value: " << string_value << "\n"; |
| |
| // Put/get list<int> value |
| typedef std::list<int> intlist; |
| typedef variant_translator<intlist> intlist_tran; |
| int list_data[] = { 1, 2, 3, 4, 5 }; |
| pt.put<intlist>( |
| "list value" |
| , intlist( |
| list_data |
| , list_data + sizeof(list_data) / sizeof(*list_data) |
| ) |
| , intlist_tran() |
| ); |
| intlist list_value = pt.get<intlist>( |
| "list value" |
| , intlist_tran() |
| ); |
| std::cout << "List value: "; |
| for (intlist::iterator it = list_value.begin(); it != list_value.end(); ++it) |
| std::cout << *it << ' '; |
| std::cout << '\n'; |
| } |