この署名を持つテンプレートメンバー関数があります:
template<typename T> void sync(void (*work)(T*), T context);
型の引数を受け入れる関数へのポインタを使用して呼び出すことができますT*
。context
その関数に渡されます。実装は次のとおりです。
template<typename T> void queue::sync(void (*work)(T*), T context) {
dispatch_sync_f(_c_queue, static_cast<void*>(&context),
reinterpret_cast<dispatch_function_t>(work));
}
使用reinterpret_cast<>
して動作します。問題は、規格がそれをうまく定義しておらず、非常に危険であるということです。どうすればこれを取り除くことができますか?試しstatic_cast
ましたが、コンパイラエラーが発生しました。
static_cast
fromvoid (*)(std::__1::basic_string<char> *)
todispatch_function_t
(akavoid (*)(void *)
)は許可されていません。
dispatch_function_t
はCタイプで、と同じvoid (*)(void*)
です。
十分にはっきりしていたかどうかはわかりません。指定されたコールバック関数をdispatch_sync_f
呼び出し、指定されたコンテキストパラメータをそのコールバック関数に渡します。(これは別のスレッドで行われますが、この質問の範囲外です。)