繁体   English   中英

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

Is Adding boost::any in a boost::property_tree Possible?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在尝试将boost ::: any类型存储到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]’
1 个回复

boost::any没有operator << 您不能在property_tree使用any anyVar.type()返回std::typeinfo ,此类提供有关类型的runtime信息。

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

将给定路径上节点的值设置为提供的值,将其转换为树的数据类型。 如果该节点不存在,则会创建该节点,包括所有缺少的父节点。

您可以创建Translator并将其传递给put函数,因为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

1 添加子树到boost :: property_tree元素

我想要的是: 我得到的是: 我试过的是: 我试图通过使用put / add / add_child / etc获得所需的结果。 但没有成功。 我必须使用哪些增强功能? ...

2 将类存储在boost :: property_tree中

我正在研究一个程序,以记录有关程序中变量的信息。 我想按文件-&gt;函数-&gt;变量对这些信息进行分组。 boost :: property_tree似乎很适合此操作,因为我可以将Access对象存储在树中的路径( file.function.variable )中,然后轻松地将树转 ...

3 Boost :: Property_Tree设置

多亏了Boost :: Property_Tree,我正在尝试配置XML文件。 我想要的聊天是: 我所拥有的是: 我发现我不得不使用 但这无法编译。 错误是: IntelliSense:“ write_xml”的任何实例都不与参数列表匹配,参数类型为:(co ...

4 boost :: property_tree没有例外

我需要解析一些INI文件。 为此,我尝试使用boost::property_tree ,但在我的系统中不允许使用异常。 如何在使用boost::property_tree时禁用异常支持? 如果没有办法做到这一点,我们非常感谢对其他图书馆的任何建议。 在@sehe的答案之后,我 ...

5 如何在boost :: property_tree中检测重复的条目

我想递归地遍历boost :: property_tree,其特定目的是查找和剔除重复项。 找到树中的路径后,是否有办法在父树上发出get(),而该树排除指定路径的某些实例? 我担心要解决此问题,可能需要对每个元素(从当前分支开始)进行另一个递归遍历,以肯定地标识重复项。 ...

6 如何返回boost :: property_tree的叶节点

我有一棵属性树,所有数据都存储在其叶节点中。 但是,树具有复杂的结构。 我现在想做的是: 获取树的所有(且仅)叶节点,因为它们包含数据和 重新调用通向各个叶节点的路径 最终,我希望接收所有(且仅是)叶节点的键/值对,其中键包含指向节点的完整路径,而值包含节点的值。 ...

7 从boost :: property_tree重用RapidXML

我正在做一个需要xml解析器(读取RSS feed)的项目。 我们已经在我们的代码中添加了RapidXML的副本。 但是昨天我看到boost:property_tree在名字空间boost::property_tree_details::rapidxml也包含了RapidXML的副本。 ...

暂无
暂无

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

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