12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- // ----------------------------------------------------------------------------
- // 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';
- }
|