私はvoid*
のCで1つのユースケースを考えていましたが、そのコードをC++に翻訳しようとしていました。これが問題であり、次はここでC++代替案void *への特定のケース
void callback(void* args) {
Something* something = static_cast<Something*>(args);
// use something
}
Something something;
add_callback(callback, &something);
いくつかのイベントは、引数何かで発生するたびにコールバックが呼び出されるためのソリューションです。 C++でこれをやって行くための慣用的な方法(あなたはそれが正しいではないと思う場合は、より良い解決策を見つける私を助ける)
Something something;
add_callback([=something]() {
// do something
});
、その後add_callback()
次 ようなものになるだろうが、内部でラムダのタイプを消去するだろうし、時刻が来たら電話をかけるためにstd::function<>
に保管してください。これより古いバージョンの利点は、コールバックがその状態をよりよくカプセル化することです。
しかし、これでわかった問題は、コールバックが呼び出されるたびに仮想関数ディスパッチの不要なオーバーヘッドが発生することです。 (仮定できるオーバーヘッドがなくても、私が好奇心を持っているだけなのでオーバーヘッドであると仮定します)、私が考えることができる唯一の解決策は、ここでstd::any
を使用することです(ただし、オブジェクトはコピーを構成可能にする必要があります)。 std::any
をメンバ変数として使用してコールバックを統一するか、またはstd::any
を関数(関数ポインタとして格納)に渡し、コールバックの状態のカプセル化を放棄します。しかし、何かもっと良い解決策があると私に伝えます...
私が理解していないのは、コールバックが指すものが*常に*「何か」であれば、なぜ 'void *'となるのでしょうか?なぜ、「何か」を取ってみませんか? – Brian
@Brian 'add_callback()'を提供するライブラリは、libevent – Curious
@downvoterの 'event_new()'のようなことを知らないので、downvotingの理由を説明できますか? – Curious