Cスタイルのコールバックインターフェイスは通常、関数ポインタとユーザーデータポインタの2つの値を渡すことによって実行されます。必要に応じて、構造体でラップすることでこれを空想することができます。
したがって、dllインターフェイスをCスタイルのままにしたい場合はstd::function
、そのペアでラップする手段を提供してください。何かのようなもの:
bool c_style_callback(void *userdata, int n) {
return (*static_cast<const Filter*>(userdata))(n);
}
呼び出し元のdllで実行され、本当に必要なインターフェイスを提供する便利な関数をヘッダーファイルで提供できます。
inline void register_callback(const Filter &filter) {
register_c_style_callback(c_style_callback, static_cast<void*>(&filter));
}
filter
私は怠惰で、コールバックが登録されている限りそれが有効であり続けることを保証するのは発信者の責任になりました。そのコピーを動的に割り当て、コールバックが登録解除されたときにそれを取得して解放するコードを追加することで、これを修正できます(このコードも呼び出し元のdllで実行されます)。登録解除が呼び出し元によって開始された場合、登録されたコールバックを表す何らかのハンドルが必要になります。
怠惰はFilter
、戻った後に再びそれを使用しないアルゴリズムに渡された述語である場合に報われます。フィルタが無期限に登録されている場合にのみ、ライフタイムを管理するためのメカニズム全体が必要になります。