2014年5月14日水曜日

とりあえずBoost.Pythonを使う(2) dictを使う

Boost.Pythonを使ってC++とPython間でdictionaryのやり取りを行う。
まずはじめに出会う例はmap_index_suiteを使う例だが、これはpythonで使う場合に.keys()などのメソッドが使えないので困る。
なのでboost::python::dictを直接やり取りするようなメソッドを準備する。

まずPythonのdictionaryをC++のmapにセットする場合のクラス・メソッドは例えば以下のようになる。

#include <boost/python.hpp
void Hoge::set_dict(const boost::python::dict &pydict)
{
    std::map<std::string, double> newmap;

    int len = boost::python::len(pydict);
    boost::python::list keys = pydict.keys();

    for(int i=0; i < len; i++) {
        std::string k = boost::python::extract<std::string>(keys[i]);
        newmap[k] = boost::python::extract<double>(pydict[k]);
    }
    _dict = newmap;
}

逆にC++のマップをPythonのdictionaryとして返す場合は以下のようにする。
boost::python::dict Hoge::get_dict() const
{
    boost::python::dict pydict;

    std::map<std::string, double>::const_iterator it;
    for(it = _dict.begin(); it != _dict.end(); it++)   
          pydict[it->first]=it->second;        
    
    return pydict; 
}




0 件のコメント:

コメントを投稿