如何从中获取枚举boost::property_tree
?
这是我的"不工作"的例子.
EMISSION::EMIT1 42
#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初始化静态地图,因为它看起来比其他方法更清晰.