C++ で記述されたライブラリを Python API libwebqqにラップしています
ブースト機能で定義されている型があります。
typedef boost::function<void (std::string)> EventListener;
Python レベルでは、「EventListener」変数のコールバックを定義できます。
クラス Adapter の event_map である C++ レベルのマップ構造もあります。event_map のキーの型は QQEvent 列挙型であり、event_map の値の型は、EvenListener をラップするクラス "Action" です。
class Action
{
EventListener _callback;
public:
Action (){
n_actions++;
}
Action(const EventListener & cb ){
setCallback(cb);
}
virtual void operator()(std::string data) {
_callback(data);
}
void setCallback(const EventListener & cb){
_callback = cb;
}
virtual ~Action(){ std::cout<<"Destruct Action"<<std::endl; n_actions --; }
static int n_actions;
};
class Adapter{
std::map<QQEvent, Action > event_map;
public:
Adapter();
~Adapter();
void trigger( const QQEvent &event, const std::string data);
void register_event_handler(QQEvent event, EventListener callback);
bool is_event_registered(const QQEvent & event);
void delete_event_handler(QQEvent event);
};
クラス Adapter の「register_event_handler」は、関連するイベントにコールバック関数を登録するための API です。イベントが発生した場合、C++ バックエンドがそれを呼び出します。しかし、Python レベルでコールバックを実装する必要があります。そして、コールバック タイプを「callback.i」でラップしました。
問題は、テスト pythonスクリプトでregister_event を呼び出すと、常に型エラーが発生することです。
Traceback (most recent call last):
File "testwrapper.py", line 44, in <module>
worker = Worker()
File "testwrapper.py", line 28, in __init__
a.setCallback(self.on_message)
File "/home/devil/linux/libwebqq/wrappers/python/libwebqqpython.py", line 95, in setCallback
def setCallback(self, *args): return _libwebqqpython.Action_setCallback(self, *args)
TypeError: in method 'Action_setCallback', argument 2 of type 'EventListener const &'
Destruct Action
このタイプのエラーの根本的な原因と、この問題の解決策を見つけてください。