C++相談室 part166 (569レス)
上下前次1-新
抽出解除 レス栞
226(2): デフォルトの名無しさん (ワッチョイ eea1-bAVr) [sage] 2025/06/04(水) 23:27:49.48 ID:GWnctGWc0(4/4) AAS
とりま↓こうしたら逝けた……
外部リンク:ideone.com
んまーfooのインスタンスの寿命を考えたらstd::function<T>はfooをコピーする実装になるという予想の下に、
fooを構築したときのthisをメンバm_objIDに記憶させて、fooの等値演算はm_objIDの比較で行うようにしたらイゴイタ……
5chは漏れの日記帳……
227(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 29f7-FMYs) [sage] 2025/06/05(木) 03:33:47.67 ID:lIQfbdfd0(1) AAS
>>226
この場合に呼び出されるコンストラクタは
template<class F> function(F f);
なのでコピーされることはこのシグネチャから自明。
外部リンク[con]:timsong-cpp.github.io
std::function は (同じ形式で呼び出しが可能なら) 違う型のオブジェクトを統一的に扱うことが目的なので入れる型を限定してしまうような構造は std::function を使う甲斐がない。
どういう状況で比較しようとしてるのかわらんけど、そういうのが必要になってるなら設計が根本的に失敗してる可能性を疑う。
231: はちみつ餃子◆8X2XSCHEME (ワッチョイ 8d32-FMYs) [sage] 2025/06/05(木) 12:10:53.33 ID:BNqgyRrD0(1/3) AAS
>>229229(2): デフォルトの名無しさん (ワッチョイ eea1-bAVr) [sage] 2025/06/05(木) 08:28:31.27 ID:ExyrcTL10(2/2) AAS
コールバック関数の自由な登録というのをstd::function<T>として登録することを考えて居たけんども
素のstd::function<T>ではチェックが自由にできないということがわかりた……
MSVCとかで関数を入れたstd::function<double (int, long)>に対し関数オブジェクトfooとしてtarget<foo>()するか
反対のことをしたらcatchできない例外が発生すた、(多分構造化例外か何かでSTLの仕様的にはおそらく未定義動作
故に素のstd::function<T>を使おうとする限り、入れるブツをdynamic_cast可能な関数オブジェクトに限定するとかしないと
手の打ちようが無いorz
現実解はstd::function<T>をwrapした「コールバック関数クラス」の創設……
target で指定した型と実際に入っている動的な型が合致しない場合はヌルポインタが返される仕様になっていてそれ自体は問題ない。
実際のコードがどうなってるか示されていないけれど、 >>226 の延長線のようなコードだとしたらヌルポインタ返ってきたときヌルポインタに単項 * を適用していることになるし、更にはそのメンバ関数である operator== を呼び出したりデータメンバ m_objID にアクセスしたりしてるのが全部ダメ。
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 1.133s*