私はシンプルなイベントライブラリを用意しています。これはC++で書かれており、Boostライブラリを使用しています。私は前記ライブラリをPythonに公開したかったので、当然私はBoost :: Pythonに目を向けるようになりました。最終的には、コンパイルするコードを手に入れましたが、今はかなり問題に直面しています。私のライブラリは、高次プログラミング技術を使用しています。たとえば、ライブラリーは、イベント・クラス、イベント・マネージャー・クラス、およびイベント・リスナー・クラスの3つのメイン・クラスで構成されています。イベントリスナークラスに問題があります。コード:Boost :: Pythonを使用した高次プログラミング
class listener{
public:
listener(){}
void alert(cham::event::event e){
if (responses[e.getName()])
responses[e.getName()](e.getData());
}
void setResponse(std::string n, boost::function<void (std::string d)> c){responses.insert(make_pair(n, c));}
void setManager(_manager<listener> *m){manager = m;}
private:
std::map<std::string, boost::function<void (std::string d)> > responses;
_manager<listener> *manager;
ご覧のとおり、機能setResponse
が問題です。残念ながら、Boost :: Pythonはこの状況でコンバータの魔法を適用しません。次のように呼び出されたとき:
>>> import chameleon
>>> man = chameleon.manager()
>>> lis = chameleon.listener()
>>> def oup(s):
... print s
...
>>> lis.setResponse("event", oup)
それは、このエラーを与える:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
Boost.Python.ArgumentError: Python argument types in
listener.setResponse(listener, str, function)
did not match C++ signature:
setResponse(cham::event::listener {lvalue}, std::string, boost::function<void()(std::string)>)
だから、私の質問は、私はこの問題を解決できるか、でしょうか?私はライブラリをC++で呼び出し可能にしたいので、オーバーロードまたはラッパーを使用する必要があります。
+1 Boost :: Pythonは非常にクールなアイデアだと思っています。 – zmbq