免責事項:はい、私はを知っています約boost::python::map_indexing_suite
を知っています。Boost.Pythonでstd :: mapまたはstd :: vector引数を取るコンストラクタでC++クラスをラップする方法は?
タスク:Boost.PythonでラップしたいC++クラスがあります。そのコンストラクタはstd::map
引数をとります。ここでC++ヘッダである:ここで
// myclass.hh
typedef std::map<int, float> mymap_t;
class MyClass {
public:
explicit MyClass(const mymap_t& m);
// ...
};
// ...
はBoost.Pythonラッパー(のみ要部)である:
// myclasswrapper.cc
#include "mymap.hh"
#include "boost/python.hpp"
#include "boost/python/suite/indexing/map_indexing_suite.hpp"
namespace bpy = boost::python;
// wrapping mymap_t
bpy::class_<mymap_t>("MyMap")
.def(bpy::map_indexing_suite<mymap_t>())
;
// wrapping MyClass
bpy::class_<MyClass>("MyClass", "My example class",
bpy::init<mymap_t>() // ??? what to put here?
)
// .def(...method wrappers...)
;
これがコンパイル。しかし、私はコンストラクタへの引数として何を渡すべきかわからないので、私は、MyClass
オブジェクトをPython側から作成することはできません。辞書はstd::map
-s自動的に変換されません:
# python test
myclass = MyClass({1:3.14, 5:42.03})
インタプリタは(当然のように)文句を言う:Pythonの側
Boost.Python.ArgumentError: Python argument types in
MyClass.__init__(MyClass, dict)
did not match C++ signature:
__init__(_object*, std::__1::map<int, float, ...
とMyMap
は、いずれかの辞書で初期化することはできません。
グーグルでは、グーグルでグーグルで調べたところ、.def(...)
にマップされているstd::map
の引数を取った「通常の」メソッドの例しか見つかりませんでした。そして、.def(...)
では、マップされたメソッドの引数を明示的に指定する必要はありません。それらは魔法のように発見されます。コンストラクタでは、boost::python::init<...>()
を使用する必要があります。少なくとも、これはドキュメントから理解したものです。
質問:
- 私はPythonの辞書から
map_indexing_suite
変換を助けるためにMyMap
ラッパーに何かを追加ましょうか? MyClass
ラッパーのboost::python::init<...>
に別のテンプレート引数を使用しますか?- その他のアイデア...?
注:暗黙の無 以来、map_indexing_suiteソリューションは、動作しません
」記録のために:私はまた、私は下にスクロールして@YvesgereYによってコメントを読んで、this accepted answer at SO見てきました"dict-> std :: map" from_pythonコンバーターが適用されます。 "
そして私は
'boost :: python :: dict'からオブジェクトを構築するスタンドアロンの関数を作成します。インスピレーションのために[この回答](http://stackoverflow.com/a/18793953/3962537)を参照してください。 –
@DanMašek:多くのおかげで、あなたのコメントはとても役に立ちました。私は今私自身の質問に答えました、以下を参照してください。 –