Возможно ли добавить boost :: any в boost :: property_tree?

Я пытаюсь сохранить boost :: any type в дереве свойств boost. Вот некоторый работающий пример:

#include <string>
#include <vector>
#include <sstream>
#include <iostream>
#include <sys/types.h>
#include <boost/any.hpp>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>

int main()
{
boost::property_tree::ptree pTree_Root;
pTree_Root.put("sigRoot.property1", "value1");
pTree_Root.put("sigRoot.property2", "value2");
pTree_Root.put("sigRoot.property3", "value3");

std::vector<std::string> vecString;

for(int i = 0; i <= 5; i++) {
vecString.push_back("somestring");
}

boost::any anyVar = vecString;

pTree_Root.put("sigRoot.property4", anyVar);

std::stringstream ss;
boost::property_tree::json_parser::write_json(ss, pTree_Root);
std::string jsonString = ss.str();

jsonString.erase(std::remove(jsonString.begin(), jsonString.end(), '\n'), jsonString.end());

std::cout << jsonString << std::endl;

return 0;
}

Это не работает, вероятно, по той же причине boost :: any не сериализуем. Но я вижу, что мне разрешено anyVar.type()Но я понятия не имею, что с этим можно сделать. Можно ли как-то использовать auto или что-то еще, чтобы добавить данные в дерево свойств без явного кодирования фиксированного числа известных типов здесь? Методы C ++ 11 / C ++ 0x также приветствуются.

Это ошибка, которую я получаю:

In file included from /usr/include/boost/property_tree/ptree.hpp:17:0,
from pTreeTest.cpp:8:/usr/include/boost/property_tree/stream_translator.hpp: In static member function ‘static void boost::property_tree::customize_stream<Ch, Traits, E, Enabler>::insert(std::basic_ostream<_Ch, _Tr>&, const E&) [with Ch = char, Traits = std::char_traits<char>, E = boost::any, Enabler = void]’:
/usr/include/boost/property_tree/stream_translator.hpp:199:13:   instantiated from ‘boost::optional<std::basic_string<Ch, Traits, Alloc> > boost::property_tree::stream_translator<Ch, Traits, Alloc, E>::put_value(const E&) [with Ch = char, Traits = std::char_traits<char>, Alloc = std::allocator<char>, E = boost::any]’
/usr/include/boost/property_tree/detail/ptree_implementation.hpp:795:54:   instantiated from ‘void boost::property_tree::basic_ptree<Key, Data, KeyCompare>::put_value(const Type&, Translator) [with Type = boost::any, Translator = boost::property_tree::stream_translator<char, std::char_traits<char>, std::allocator<char>, boost::any>, Key = std::basic_string<char>, Data = std::basic_string<char>, KeyCompare = std::less<std::basic_string<char> >]’
/usr/include/boost/property_tree/detail/ptree_implementation.hpp:817:13:   instantiated from ‘boost::property_tree::basic_ptree<K, D, C>& boost::property_tree::basic_ptree<Key, Data, KeyCompare>::put(const path_type&, const Type&, Translator) [with Type = boost::any, Translator = boost::property_tree::stream_translator<char, std::char_traits<char>, std::allocator<char>, boost::any>, Key = std::basic_string<char>, Data = std::basic_string<char>, KeyCompare = std::less<std::basic_string<char> >, boost::property_tree::basic_ptree<Key, Data, KeyCompare>::path_type = boost::property_tree::string_path<std::basic_string<char>, boost::property_tree::id_translator<std::basic_string<char> > >]’
/usr/include/boost/property_tree/detail/ptree_implementation.hpp:832:72:   instantiated from ‘boost::property_tree::basic_ptree<K, D, C>& boost::property_tree::basic_ptree<Key, Data, KeyCompare>::put(const path_type&, const Type&) [with Type = boost::any, Key = std::basic_string<char>, Data = std::basic_string<char>, KeyCompare = std::less<std::basic_string<char> >, boost::property_tree::basic_ptree<Key, Data, KeyCompare>::path_type = boost::property_tree::string_path<std::basic_string<char>, boost::property_tree::id_translator<std::basic_string<char> > >]’pTreeTest.cpp:26:47:   instantiated from here
/usr/include/boost/property_tree/stream_translator.hpp:33:13: error: cannot bind ‘std::basic_ostream<char>’ lvalue to ‘std::basic_ostream<char>&&’
/usr/include/c++/4.6/ostream:581:5: error:   initializing argument 1 of ‘std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char, _Traits = std::char_traits<char>, _Tp = boost::any]’

2

Решение

Нет. boost::any не имеет operator <<, Вы не можете использовать any в property_tree, anyVar.type() возвращается std::typeinfoэтот класс обеспечивает runtime информация о типе.

template<typename Type, typename Translator>
self_type & put(const path_type & path, const Type & value, Translator tr);


Установите значение узла в данном пути к предоставленному значению, переведенному в тип данных дерева. Если узел не существует, он создается, включая всех его отсутствующих родителей.

Вы можете создать Translator и передать его в функцию положить, так как ptree действительно basic_ptree<std::string, std::string> ваш переводчик должен конвертировать ваши any в string,

Простой пример переводчика

struct SimpleTranslator
{
public:
boost::optional<std::string> put_value(const boost::any& value)
{
if (value.type() == typeid(std::vector<std::string>))
{
std::stringstream ss;
std::vector<std::string> vec = boost::any_cast<std::vector<std::string>>(value);
std::copy(vec.begin(), vec.end(), std::ostream_iterator<std::string>(ss));
return ss.str();
}
return boost::optional<std::string>();
}
};

http://liveworkspace.org/code/275820c1becfb63deda4e4eed8524833

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]