私は、C++クラスに登録されている「呼び出し可能オブジェクト」を渡すことができるはずのPythonでプログラムを書いています。これまでのところ、次のコードを記述しました。
C ++:
class MyClass
{
...
public:
register_callback(boost::function<void (int)> fun);
};
Python / C API:
class_<MyClass, boost::shared_ptr<MyClass>, boost::noncopyable>("MyClass", no_init)
.def("register_callback", &MyClass::register_callback);
コードはコンパイルされますが、Pythonからメソッドを呼び出し、呼び出し可能オブジェクト(私の場合は別のインスタンスメソッド)を渡すと、次のランタイムエラーが発生します。
Boost.Python.ArgumentError: Python argument types in
MyClass.register_callback(MyClass, instancemethod)
did not match C++ signature:
register_callback(MyClass {lvalue}, boost::function<void ()(int)>)
boost :: functionが必要になるたびに、彼が呼び出し可能オブジェクトを安全に渡すことができることをブーストに伝える方法が必要だと思います。手作りのソリューションを使用すれば、すべてが機能します。
void my_caller(MyClass* obj, object callable)
{
obj->register_callback(callable); // Works!
}
class_<MyClass, boost::shared_ptr<MyClass>, boost::noncopyable>("MyClass", no_init)
.def("register_callback", &my_caller);
私はこのようなレジスター関数をいくつか持っているだけなので、手作りのソリューション(役立つマクロを使用)に固執することができますが、変換を自動的に行うためにboost::pythonをどのように指示できるのでしょうか。ドキュメントを見ると、to_python_converterディレクティブが見つかりました。これは、皮肉なことに、必要なものとは正反対です...