What have you found for these years?

2008-01-04

enable_shared_from_this (1)

上一篇說搞不懂這是什麼,後來由於被迫使用,測試了一陣,
加上翻翻 source code, 恍然大悟。再去 shared_ptr 中翻翻
其他的 source code, 大致印證了想法無誤。那麼,其實 shared_ptr
應該算是個精巧的小玩具,並沒有什麼神奇的功能吧。

這樣,SmartPtr 應該是會強大非常多才對。

不過正因為 shared_ptr 構造如此單純,只要掌握幾個原則,
shared_ptr 倒是很好掌握,可以快速上手。我這裡先提幾個原則:

1. shared_ptr 只有第一個人可以無中生有,剩下的全部要用 copy 的。
2. shared_from_this 呼叫前,必然至少得有一個有效的 shared_ptr.

大致上就是這兩點,遵守之後應該就不會有什麼問題,也不用擔心 deleter.
只是讓我感到很囧的是,enable_shared_from_this + shared_ptr 這作法
對我來說太暴力了。我一直以為他們只是前者操作後者,結果卻是暴力相依。

我找了一些 reference, 還有一些 source code 上的重點,下次說,因為
現在我很累了,而且明天又要去受精神轟炸,半夜不應該太消耗精神,
否則白天就會攤掉了。

這篇閒聊的 btw 在這:

最近老是到處找吃的,吃吃喝喝吃吃呵呵癡癡呵呵___
不過有點食不知味 :(
但搞不好正是因為食不知味才會一直想找吃的...
就好像內心大喊「為什麼」那樣吧

3 retries:

老林 said...

amazing...

typeof(a) is shared_ptr"A"

bind(&A::f, a); //Ok!
bind(&A::f, a.get()); //Ok!
bind(&A::f, *a); //Ok!

上面三個寫法都可以 compile 過,並有效地把 A::f bind 成普通 function

godfat 真常 said...

還好啦,a.get() 和 *a 就一個 pointer 一個 reference...

直接丟 a 也行的話,就表示他內部做了額外的判斷,像是 is_pointer 之類的 traits

godfat 真常 said...

http://www.boost.org/doc/html/boost_typetraits/reference.html#boost_typetraits.is_pointer

Important
is_pointer detects "real" pointer types only, and not smart pointers. Users should not specialise is_pointer for smart pointer types, as doing so may cause Boost (and other third party) code to fail to function correctly. Users wanting a trait to detect smart pointers should create their own. However, note that there is no way in general to auto-magically detect smart pointer types, so such a trait would have to be partially specialised for each supported smart pointer type.

所以他應該是額外有個 shared_ptr 的 specialization...
或是某個具有 shared_ptr spec 的 template

Post a Comment

All texts are licensed under CC Attribution 3.0