如何从 boost::property_tree 获取枚举?

Posted

技术标签:

【中文标题】如何从 boost::property_tree 获取枚举?【英文标题】:How to get enum from boost::property_tree? 【发布时间】:2013-12-28 17:57:18 【问题描述】:

如何从boost::property_tree 获取枚举?

这是我的“非工作”示例。

config.xml

<root>
  <fooEnum>EMISSION::EMIT1</fooEnum>
  <fooDouble>42</fooDouble>
</root>

main.cpp

#include <iostream>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>

int main()

  enum class EMISSION  EMIT1, EMIT2  ;
  enum EMISSION myEmission;

  //Initialize the XML file into property_tree
  boost::property_tree::ptree pt;
  read_xml("config.xml", pt);

  //test enum (SUCCESS)
  myEmission = EMISSION::EMIT1;
  std::cout << (myEmission == EMISSION::EMIT1) << "\n";

  //test basic ptree interpreting capability (SUCCESS)
  const double fooDouble = pt.get<double>("root.fooDouble");
  std::cout << fooDouble << "\n";

  //read from enum from ptree and assign (FAILURE)
  myEmission = pt.get<enum EMISSION>( "root.fooEnum" );
  std::cout << (myEmission == EMISSION::EMIT1) << "\n";

  return 0;

编译输出

/usr/include/boost/property_tree/stream_translator.hpp:36:15: 
error: cannot bind 'std::basic_istream<char>' lvalue to 
'std::basic_istream<char>&&'

/usr/include/c++/4.8/istream:872:5: error:   
initializing argument 1 of 'std::basic_istream<_CharT, 
  _Traits>& std::operator>
(std::basic_istream<_CharT, _Traits>&&, _Tp&)
[with _CharT = char; _Traits = std::char_traits<char>;
_Tp = main()::EMISSION]'

【问题讨论】:

你可以从这个问题***.com/questions/726664/string-to-enum-in-c获取字符串然后使用EnumParser类 【参考方案1】:

C++ 中枚举的名称是一个符号,而不是字符串。除非您通过编写如下方法自己提供该映射,否则无法在字符串和枚举值之间进行映射:

EMISSION emission_to_string(const std::string& name)

    if ( name == "EMISSION::EMIT1")
    
        return EMISSION::EMIT1;
    
    ... etc

然后,您将从 property_tree 中获取字符串形式的值并应用此映射。

有更好的方法来实现这一点,可以通过许多枚举值更优雅地扩展。我已经使用 boost::bimap 来启用从 enum->string 或从 string->enum 的映射,当然这也为您提供了一个映射而不是一个愚蠢的大 if 语句。如果您这样做,请考虑使用 boost::assign 来初始化您的静态地图,因为它看起来比其他方法更干净。

【讨论】:

我担心这将成为答案 - 这绝对是我的问题的解决方案。我试图避免从树中读取我的枚举作为字符串,然后从那里重新解释它们(你的例子)。感谢您提供解释和指导。【参考方案2】:

字符串和枚举之间的映射必须手动完成。但是,您可以为枚举实现翻译器,如下所述:http://akrzemi1.wordpress.com/2011/07/13/parsing-xml-with-boost/

有了这个,你可以方便地写

myEmission = pt.get<EMISSION>("root.fooEnum");

【讨论】:

以上是关于如何从 boost::property_tree 获取枚举?的主要内容,如果未能解决你的问题,请参考以下文章

如何区分两个 boost::property_tree?

如何使用 boost::property_tree 重置 xml 元素的属性?

如何扩展 boost property_tree 来处理自定义类型?

为自定义路径类型设置 boost property_tree

如何将任何值转换为对象并使用 boost::property_tree json 添加成员

如何使用 json 解析器的 boost property_tree 创建空数组节点