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

2023-11-26

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

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

配置文件

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

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 来初始化您的静态映射,因为它看起来比其他方法更干净。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 boost::property_tree 获取枚举? 的相关文章

随机推荐

  • Discord 机器人 - “属性错误:‘NoneType’对象没有属性‘strip’。

    我是一名新编码员 我一直在关注tutorial关于如何使用下面的代码创建一个不和谐的机器人 实际上已经直接从教程中复制了代码 并且我创建了一个 env 文件来存储我的 AuthToken 每次运行代码时 我都会收到上述代码下方的错误 有小费
  • 未找到 Android Studio Gradle DSL 方法:“android()”--错误(17,0)

    我尝试在 Android Studio 中运行我的项目 但出现以下错误 我跟踪了许多消息来源只是为了让它运行并最终来到这里 但不知道还能做什么 我该如何配置这个项目来运行 构建 gradle Top level build file whe
  • gdb 通过走帧指针进行回溯

    有时会出现一些小的堆栈损坏 导致 gdb 无法执行 回溯 我创建了以下 gdb 宏 x86 64 可以轻松地使其适用于 x86 该宏取决于关闭 omit frame pointer 即 fno omit frame pointer 并向我展
  • Python拒绝多次迭代文件中的行[重复]

    这个问题在这里已经有答案了 我正在编写一个程序 需要我多次迭代文件的每一行 loops 0 file open somefile txt while loops lt 5 for line in file print line loops
  • 使用 php 更改 css 值

    如何更改在我的主页上从管理区域显示一些文本的 div 的 css 我希望当我在插件管理页面中输入颜色代码时 该代码会在 css 文件中更新 这是很平常的事 却无法把握 这是我的 div 的 css div background 0000 这
  • 如何在 PHP 中使用 Graph API 使用 message_tags 字段发布消息

    我想使用 Graph API 发布带有 message tags 的消息 我确认消息仅在 PHP 中发布 但不适用于 message tags 这是示例代码
  • javascript - 为什么有同步和异步模块的规范?

    我刚刚读完这篇文章article在 Javascript 模块上 我可以理解CommonJS模块是同步加载的 而AMD模块是异步加载的 我不明白的是我怎样才能模块变成神奇地同步如果我以 CommonJS 格式编写它 或者如果我以 Commo
  • 角度表单验证以验证电话号码

    我正在尝试使用角度中的正则表达式来验证电话号码 HTML 内容 div class form group row div
  • SetStdHandle 对 cout/printf 没有影响

    标题说明了一切 当我运行以下代码时 HANDLE hOut GetStdHandle STD OUTPUT HANDLE HANDLE hFile CreateFile TEXT Foo txt GENERIC WRITE FILE REA
  • Perl 中的标量上下文和列表上下文有什么区别?

    Perl 中的标量上下文和列表上下文有什么区别 这在其他语言 例如 Java 或 Javascript 中是否有相似之处 Perl 中的各种运算符都是上下文相关的 并且在列表和标量上下文中产生不同的结果 例如 my array 1 2 4
  • 强制对 js 或 axios 使用不同的用户代理

    我通过 axios get 和 post 请求路由所有请求 我正在测试一些 iframe 它们检测用户代理 并根据它是什么代理 它们更改有效负载和样式等 例如 如果我通过切换设备工具栏并设置为 iphone 在开发工具上更改它 则所有请求都
  • XMLHttpRequest 从远程主机获取 HTTP 响应

    为什么下面的代码基于 Mozilla 示例不起作用 尝试使用 Firefox 3 5 7 和 Chrome
  • 如何查看除特定控件之外的所有 FormControls ValueChanges?

    我有一个表单 每当控制输入值发生变化时就会进行计算 这是我的form group好像 form group this fb group control1 control2 control3 control10 我可以通过以下方式检测所有控件
  • C# 默认参数

    对于某人来说 这可能是一个非常简单的答案 我有一个方法Optional Parameter像这样 public static Email From string emailAddress string name var email new
  • 返回指向局部变量的指针[重复]

    这个问题在这里已经有答案了 我不知道为什么这有效 由于 x 是一个局部变量 我认为当我尝试返回它时会收到错误 然而 第一个 printf 工作正常 但随后它只打印出 0 任何人都可以解释这里发生了什么吗 include
  • 方向改变时不调用 onCreateLoader

    我的问题与此基本相同 有时调用initLoader后没有得到onCreateLoader回调 我有2个ListFragments包含在一个ViewPager 它们一开始加载正常 但是当我改变方向时 initLoader方法不调用onCrea
  • 在这些情况下,Scala 值类将被“装箱”,对吧?

    如果我有这个值类 class ActionId val value Int extends AnyVal 那么 在下面的所有示例中 都会为值类分配一个对象吗 它将被 装箱 它将not只需将其解包为普通的 32 位整数 对吧 返回值类的函数
  • OpenCV python 的 API:FlannBasedMatcher

    我正在尝试重写所描述的代码here 使用 Opencv 的 python API 代码的第 3 步有以下几行 FlannBasedMatcher matcher std vector lt DMatch gt matches matcher
  • 如何计算二分查找复杂度

    我听到有人说 由于二分搜索将搜索所需的输入减半 因此它是 log n 算法 因为我不是数学背景的 所以我无法理解它 有人可以更详细地解释一下吗 它与对数级数有什么关系吗 这是一种更数学的方式来看待它 尽管并不复杂 IMO 比非正式的更清晰
  • 如何从 boost::property_tree 获取枚举?

    如何从 a 获取枚举boost property tree 这是我的 非工作 示例 配置文件