简体   繁体   English

是否可以在boost :: property_tree中添加boost :: any?

[英]Is Adding boost::any in a boost::property_tree Possible?

I am trying to store a boost::any type to a boost property tree. 我正在尝试将boost ::: any类型存储到boost属性树。 Here is some runnable example: 这是一些可运行的示例:

#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;
}

This does not work, probably for the same reason boost::any is not serializable. 这不起作用,可能出于同样的原因boost :: any不可序列化。 But I see I am allowed to query anyVar.type() , but I have no idea what can be done with it. 但是我看到我可以查询anyVar.type() ,但是我不知道该怎么办。 Is it possible to somehow use auto or something else to add the data to the property tree without explicitly coding a fixed number of known types here? 是否可以以某种方式使用auto或其他方式将数据添加到属性树,而无需在此处显式编码固定数量的已知类型? C++11/C++0x methods are also welcome. 也欢迎使用C ++ 11 / C ++ 0x方法。

This is the error I get: 这是我得到的错误:

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]’

No. boost::any has no operator << . boost::any没有operator << You cannot use any in property_tree . 您不能在property_tree使用any anyVar.type() returns std::typeinfo , this class provides runtime information about type. anyVar.type()返回std::typeinfo ,此类提供有关类型的runtime信息。

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

Set the value of the node at the given path to the supplied value, translated to the tree's data type. 将给定路径上节点的值设置为提供的值,将其转换为树的数据类型。 If the node doesn't exist, it is created, including all its missing parents. 如果该节点不存在,则会创建该节点,包括所有缺少的父节点。

You can create Translator and pass it to function put, since ptree is really basic_ptree<std::string, std::string> your translator should convert your any to string . 您可以创建Translator并将其传递给put函数,因为ptree实际上是basic_ptree<std::string, std::string>您的翻译器应将any转换为string

Simple example of translator 译者的简单例子

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 http://liveworkspace.org/code/275820c1becfb63deda4e4eed8524833

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM