gpt4 book ai didi

c++ - 如何从 boost::property_tree 获取枚举?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:36:56 26 4
gpt4 key购买 nike

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

关于c++ - 如何从 boost::property_tree 获取枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20507653/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com