私はboost pythonを使ってC++ライブラリへのバインディングを作成しています。このライブラリのいくつかのクラスは、iterator/const_iterator型を引数として受け取る仮想メソッドを持っています。私は特にこれらの型を公開したくはありませんが、代わりに適切なコンテナを受け入れる仮想メソッドの周りにいくつかのラッパーを作成したいと考えています。私の質問は、 'デフォルトの実装'関数でこのラッピングを行うのは安全ですか?仮想メソッドをラップしたPythonをブーストする
class Test
{
public:
Test();
virtual ~Test();
virtual void iterate(std::vector<int>::iterator it);
};
その後、ラッパークラスでデフォルトをラップ..
struct Test_wrapper: Test, boost::python::wrapper<Test>
{
.....
virtual void iterate(std::vector<int>::iterator it);
void default_iterate(std::vector<int> it)
{
Test::iterate(it.begin());
}
};
と
boost::python::class_<Test_wrapper>("Test")
.def("iterate" ,(void (Test_wrapper::*)(std::vector<int>))(&Test_wrapper::default_iterate));
...との結合を設定するチュートリアルが言うので、私はこれがわかりませんよ2つの関数を 'def'に渡す必要があるが、ただ1つを渡すだけで動作するように思われる。(http://www.boost.org/doc/libs/1_43_0/libs/python/doc/tutorial/doc/html/python/exposing.html#python.class_virtual_functions)
これについてのアドバイスをいただければ幸いです。事前に
おかげで、
ババク
編集: は、具体的には、私は方法「voxelToWorld」を含むクラスをバインドしようとしている
。このメソッドは、vsP/endのポイントに基づいてwsP内の位置を変換します。私は、このインターフェイスをより多くの 'pythonic'ようにこの関数をラップしたいと思いますが、私はこれを行うための正しい方法についてはわかっていません。すなわち、C++クラスから派生するPythonのクラスでは - あなたが参照する仮想関数の
class FieldMapping
{
public:
...
virtual void voxelToWorld(std::vector<V3d>::const_iterator vsP,
std::vector<V3d>::const_iterator end,
std::vector<V3d>::iterator wsP);
};
お返事ありがとうございました。 1.うん、私はPythonで関数をオーバーライドしたいと思います。私は、PythonのインタフェースがC++と同じでない場合、それほど単純ではないかもしれないことに気付きましたが。 2.元の投稿を編集しました。うまくいけばそれは役に立ちますか? 3.良いアイデア、ありがとう:) – babak
インターフェイスが違ってもやりやすいと思います。 [wrapper docs](http://www.boost.org/doc/libs/1_43_0/libs/python/doc/v2/wrapper.html)によると、 'get_override'は' None'か呼び出し可能なオブジェクトを返します。このオブジェクトを自分でテストすることができます: 'None'ならば、関数はPythonでオーバーライドされませんでした。そして、あなたはC++を呼び出す必要があります。 'None'でなければ、呼び出し可能なPythonオブジェクト(バインドされたメソッド)であり、Python用に配列されたパラメータで呼び出すことができます。 – eudoxos