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

 杜庆坤66 发布于 2023-02-11 16:41

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

这是我的"不工作"的例子.

config.xml中


  EMISSION::EMIT1
  42

main.cpp中

#include 
#include 
#include 

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("root.fooDouble");
  std::cout << fooDouble << "\n";

  //read from enum from ptree and assign (FAILURE)
  myEmission = pt.get( "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' lvalue to 
'std::basic_istream&&'

/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;
_Tp = main()::EMISSION]'

polkadotcada.. 5

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初始化静态地图,因为它看起来比其他方法更清晰.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有