5

から列挙型を取得するにはどうすればよいboost::property_treeですか?

これは私の「動かない」例です。

config.xml

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

2 に答える 2

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 を使用して静的マップを初期化することを検討してください。他の方法よりもきれいに見えるからです。

于 2013-12-10T23:43:38.833 に答える
2

文字列と列挙型の間のマッピングは手動で行う必要があります。ただし、ここで説明されているように、列挙型のトランスレーターを実装できます: http://akrzemi1.wordpress.com/2011/07/13/parsing-xml-with-boost/

これがあれば、便利に書くことができます

myEmission = pt.get<EMISSION>("root.fooEnum");
于 2014-05-27T15:58:10.110 に答える