如何从boost::property_tree
获取枚举?
这是我的“非工作”例子。
<root>
<fooEnum>EMISSION::EMIT1</fooEnum>
<fooDouble>42</fooDouble>
</root>
#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]'
答案 0 :(得分:5)
C ++中枚举的名称是符号,而不是字符串。没有办法在字符串和枚举值之间进行映射,除非您通过编写如下方法来自己提供映射:
EMISSION emission_to_string(const std::string& name)
{
if ( name == "EMISSION::EMIT1")
{
return EMISSION::EMIT1;
}
... etc
}
然后,您将从property_tree获取值作为字符串并应用此映射。
有更好的方法来实现这一点,使用许多枚举值更优雅地扩展。我已经使用boost :: bimap来实现这一点,以便从enum-&gt;字符串OR或string-&gt; enum启用映射,当然这也为您提供了一个地图,而不是一个愚蠢的大if语句。如果你这样做,请使用boost :: assign来初始化你的静态地图,因为它看起来比其他方法更清晰。
答案 1 :(得分:1)
字符串和枚举之间的映射必须手工完成。但是,您可以按照此处的说明为枚举实现翻译器:http://akrzemi1.wordpress.com/2011/07/13/parsing-xml-with-boost/
有了这个,你可以方便地写
myEmission = pt.get<EMISSION>("root.fooEnum");