7
niha @niha28
@Cryolite そんなことよりしーらいおらいと先生はオブジェクト死んだら勝手にエントリ捨ててくれる void* でない WeakHashMap 的な unordered_map<weak_prt<K>, E,... > の実装について何かご存知ですか!!!
niha @niha28
deleter が void* しか扱えないせいでカウンタオブジェクトの特定が…raw pointer -> weak_ptr な map 内部で保持とかしたくないんだお!!!
Akso de la Malbono @Cryolite
@niha28 shared_ptr の deleter に unordered_map<...>::erase を仕掛ければ良いんではないでしょうか的な感じですか?
niha @niha28
@Cryolite 仕掛けたいんですが deleter は生のポインタさんしかわからないのでどうすればいいんだろうっていう…
niha @niha28
つまりデリータが分かるのは引数の生のポインタさんだけなのに erase するには weak_ptr が必要で、キーなめて .lock().get() == rawptr で探そうにももう捨てられてるから .lock().get() == nullptr でおいィ?ってなるという!
Akso de la Malbono @Cryolite
@niha28 ああ,でも deleter にメンバ変数持たせられるのでやり方は色々ありますよね.
Akso de la Malbono @Cryolite
っていうか私は前どうやったっけ?
niha @niha28
boost なんちゃらのスライドで Cryolite さんはこれを「map のキーを void* にする」ことで回避していたけれど、それは悲しみが鬼なる解決なので、是非プロの C++ ぷろぎらまーによりよりよいよりよりよいよい方法を教えてもらいたいたいたいたいなーって思いました。
Akso de la Malbono @Cryolite
weak_ptr は expire した後でもポインタ (所有権) 比較をする意味があるからどうにかしましょう,どうにかできます,と自己解決したはずだが結論どこいった???
niha @niha28
@Cryolite はい、例えば rawpointer -> weak_ptr な map を持つっていうのがあるんですが、これだと「カウンタオブジェクトが長生きするのを回避する」ために「余計にメモリをがっつく」というはてな?なことになって矢張り悲しみが鬼なるしどうすればいんだー
niha @niha28
何となく boost のコード読んだところ、weak_ptr の保持している生のポインタはポインタの指し示すオブジェクトが破棄されても値残ってそうなのでこいつを何とかできればいいんじゃないか…ホントカナー
Akso de la Malbono @Cryolite
@niha28 weak_ptr は expire してもポインタ値 (に相当するもの) は保持している (expire したあとに weak_ptr 同士を比較する操作には意義のある use case がある) ので,まあ,あれがこれがふにゃふにゃ
Akso de la Malbono @Cryolite
@niha28 deleter に weak_ptr を持たせるのが1つの解決方法ですけれど,これをやるにはやや tricky なことをしないといけないです.
niha @niha28
@Cryolite weak_ptr の保持してるポインタは多分そういうことのためにあるんだとは思うんですが、肝心の比較をしてくれる人が何処にも見当たらないのはどういうことなんでしょうか…これ private なのに…
niha @niha28
@Cryolite 急ぎじゃないので別にいつでもいいのですが機会があったら是非詳しく教えてください!
Akso de la Malbono @Cryolite
@niha28 !(p < q) && !(q < p) が "p == q" に相当すると思ってください. (weak_ptr には operator== はない)
niha @niha28
@Cryolite なるほどですね…なるほどとかいいましたが weak_count の operator< を知らないので適当ですがそれでいけるんですね。
niha @niha28
勉強になったけどまあ普通は unordered_map<void*, E> を持った WeakHashMap を自分で定義しちゃうなあと思うのであった。唐突なわけわからん質問にわざわざご丁寧にありがとうございました!
niha @niha28
weak_ptr の oerator< は(weak)カウンタオブジェクトのポインタ値の比較になるのか。これで比較問題は解決だけれど、結局 map 持ってないといけないことには変わらないので結局詰んでるなあ…
niha @niha28
結局結局結局なんだよ!!!とかいってる間に明日のためのユーティリティーも大体できた。
Akso de la Malbono @Cryolite
weak_ptr 用に boost::hash が特殊化されていない (できない) のはどうするべきなんだこれ?
niha @niha28
@Cryolite どうすべきなんでしょうね。0x を待つとか…
Akso de la Malbono @Cryolite
unordered_map の key_type を (void * ではなくて) weak_ptr にしたいという要求は理不尽じゃないはずなのでどうにかできないと俺がヤダヤダ!
Akso de la Malbono @Cryolite
@niha28 パッと見た感じでは 0x でも解決していません.
Akso de la Malbono @Cryolite
expired な生ポインタ値を絶対に触らない・触らせないという shared_ptr/weak_ptr のポリシも理解はするけどこれどうすんのかにゃー.
残りを読む(10)

コメント

コメントがまだありません。感想を最初に伝えてみませんか?

ログインして広告を非表示にする
ログインして広告を非表示にする