2011-07-12 2 views
1

私は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); 
}; 

答えて

0
  1. ドキュメントはpythonでさらにオーバーライドできる仮想関数をラップに関連しています。ロジックは、C++でのみC++での仮想解像度を処理するようなものです。ラッパークラス(Pythonクラスの派生元)にある場合、this->get_override(..)は、Pythonクラスがその特定の関数をオーバーライドするかどうかをさらに調べます。

    これが実際に必要なものであるかどうかは不明です(つまり、PythonクラスをC++クラスから派生させる)かどうかは不明です。通常のC++仮想関数のみを公開したい場合、仮想解像度は自動的に処理されます。

  2. さらに、私はあなたの関数がどのような種類のデータを受け取るのか理解していません。あなたはもっと具体的な例を挙げることができますか?既にC++クラスで反復処理したいデータがある場合は、特別なPython関数__iter__を定義します。これはプロキシイテレータオブジェクトを返します(C++でiteratorクラスを定義し、Pythonでも同様にラップします)。このプロキシイテレータは内部的に反復状態を保持し、__iter__(自己を返す)、next(次のコンテナ項目を返す)を定義し、最後にStopIteratonを呼び出さなければなりません。これはPython反復プロトコルであり、すべての通常の構文(forなど)は自動的に動作します。 const vector<int>&でコピーを回避する、引数としてvector<int>を通過しない

  3. (備考)(例えばイテレータクラスhere、例えばhereを参照)。 Pythonのvector<int>のコンバーター(あなたが定義した場合)はうまく動作します。

+0

お返事ありがとうございました。 1.うん、私はPythonで関数をオーバーライドしたいと思います。私は、PythonのインタフェースがC++と同じでない場合、それほど単純ではないかもしれないことに気付きましたが。 2.元の投稿を編集しました。うまくいけばそれは役に立ちますか? 3.良いアイデア、ありがとう:) – babak

+0

インターフェイスが違ってもやりやすいと思います。 [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

関連する問題