std::bind
を使用して、termios.h
ヘッダーのsigaction
へのコールバックとしてメンバー関数を使用しようとしています。私は特別なケアの必要性をメンバーの機能で取ることを理解し、そのような運がない例hereとhereを読んで従いました。コールバックとしての静的メンバー関数のバインド
Iは、静的関数を通過することができるので、私は、静的関数を残し、それ自体へのポインタ(this
)ように、第2の変数を追加した場合、私が良いだろうと思っていないが、そのような運:
// In SerialListener.h
static void callback(int status, SerialListener *ptr);
// In the serial listener constructor
// Set callback
auto cb = std::bind(&SerialListener::callback, std::placeholders::_1, this);
sigAct_.sa_handler = cb;
しかし、エラーが以下の通りである:
// In SerialListener.h
void callback(int status);
// In the serial listener constructor
// Set callback
auto cb = std::bind(&SerialListener::callback, this, std::placeholders::_1);
sigAct_.sa_handler = cb;
:
error: cannot convert ‘std::_Bind<void (*std::_Placeholder<1>, SerialListener*))(int, SerialListener*)>’ to ‘__sighandler_t {aka void (*)(int)}’ in assignment sigAct_.sa_handler = cb;
Iはまた、静的実装O/W第二の例の変化を試し...
error: cannot convert ‘std::_Bind<std::_Mem_fn<void (SerialListener::*)(int)>(SerialListener*, std::_Placeholder<1>)>’ to ‘__sighandler_t {aka void (*)(int)}’ in assignment sigAct_.sa_handler = cb;
エラーはかなり似ています、それは暗黙的にそれが必要ハンドラにバインドを変換することはできませんように見えますが、私は入力タイプとリターンの観点からそれを見たときに生成
それが機能するはずのタイプ。私は何が欠けていますか?
@NageG - クラス/構造体の 'static'メンバーは、通常と同じように機能します:特定のオブジェクトにバインドされておらず、' this'を知らない。 「この」治療は静的ではないメンバーを考慮する。 – max66
Bindは一種のクロージャ*オブジェクト*を返します。関数ポインタには変換できません。 '__sighandler_t'の別のパラメータを呼び出すことはできません。 – StoryTeller
'signal.h'の' sigaction'はありませんか? – VTT