2016-04-25 1 views
1

、あなたはこのようなパイソンのC++クラスを公開することができます。 SomeOtherFuncをPythonに後でBOOST_PYTHON_MODULEコードで公開する方法はありますか?私は返されたオブジェクトを使用しようとしましたが、プロパティdefはありません。私もMyClassの公開を再度インスタンス化しようとしましたが、それは最初のものを上書きしました。基本的に私はこのような何かを探しています:事後にBoost Pythonクラスにメンバー関数を追加しますか?のは、MyClassのは、また、機能SomeOtherFuncを持っているとしましょう</p> <pre><code>object obj = class_<MyClass>("MyClass") .def("SomeFunc", &MyClass::SomeFunc) ; </code></pre> <p>:ブーストPythonで

obj.def("SomeOtherFunc", &MyClass::SomeOtherFunc) 

私が解決しようとしている大きな問題は、私はテンプレートの基本クラスから継承するクラスの数を持っているということである、と私は見つけようとしていますそれらをPythonにきれいに公開する方法です。これまでは、クラスとそのテンプレートパラメータを取り込んで必要なclass_呼び出しを作成するテンプレート関数を作成しましたが、後でその公開クラスの定義を変更することができます。

ボーナスは、誰かが何をしているのかを正確に説明することができ、なぜ私はデフの間にコンマを必要としないのかを指摘します。

答えて

2

objのメンバー関数はdefですが、class_というメンバー関数はありません。 class_objectから継承されているため、割り当てが機能しますが、にはがありません。以下では正常に動作します:

auto obj = class_<MyClass>("MyClass") 
    .def("SomeFunc", &MyClass::SomeFunc) 
; 

// now obj is an instance of py::class_<MyClass> instead of py::object 
obj.def("SomeOtherFunc", &MyClass::SomeOtherFunc); 

あなたがclass_インスタンスに名前を付けることがないという事実は、これは単純なコンストラクタであるという事実からそらすことがあります。上記のように書いたこともできます:

class_<MyClass> obj("MyClass"); 
obj.def("SomeFunc", &MyClass::SomeFunc); 
obj.def("SomeOtherFunc", &MyClass::SomeOtherFunc); 

すべてを一度に定義する必要はありません。

defが何をしているのかを誰かが正確に説明できる場合、なぜ私はデフの間にコンマを必要としないのかを知ってください。

defは、クラステンプレートclass_のメンバ関数です。あなたがそれらをチェーンできる理由です

template <class Init>   class_& def(Init); 
template <class F>   class_& def(char const*, Fn); 
template <class Fn, class A1> class_& def(char const*, Fn, A1); 
// etc. 

:それは自己への参照を返すすべてがbunch of overloadsを、持っています。それぞれの呼び出しは、Pythonにその関数を公開するために独立して内部機構を設定し、ちょうど*thisを返します。私はあなたが何のためにコンマを必要とするのか分からない。

+0

ああ、水の部分と底がはっきりしています!ご説明ありがとうございます。私は実際には以前にautoを使用しようとしましたが、それは私のためには機能しませんでした。振り返ってみると、私は「オブジェクト」を返す関数の出力でそれを使用していたことが分かりました。私はBoost Pythonをもっとはっきりと理解しているように感じます。ありがとう! – Nickolai

関連する問題