智能指針具有非常強大的能力,謹慎而明智的選擇能帶來極大的好處。我不否認智能指針的能力,雖然我在之前的否認過auto_ptr。可能由於我自身能力的限制,體會不到auto_ptr的好處,但這樣的可能性我覺得已經不大了。但auto_ptr是最簡單的智能指針,在它的周圍存在大量的作品,這些作品包括Boost、Loki、ACE等等,但是可惜的是目前沒有一個我能夠說我很熟悉,那麼本篇只是作為一個入門,在此基礎上,應當閱讀Boost、Loki、ACE相關源碼。
Smart Pointer的核心是實現
template <class T>
T& SmartPointer<T>::operator*() const;
template <class T>
T& SmartPointer<T>::operator->() const;
Smart Pointer的構造和析構是一門藝術,由此而衍生出很多不同類型的Smart Pointer。千萬不要指望Smart Pointer的表現象原生指針,雖然可以通過隱式轉換來實現它,然而往往帶來的後果是災難性的。
Meyers給出了一個優雅的隱式轉換的辦法:
template<class T>
class TestTemplate
{
public:
TestTemplate(T* ptr = 0):pointee(ptr){}
template<class newType>
operator TestTemplate<newType>()
{
return TestTemplate<newType>(pointee);
}
private:
T* pointee;
};
可惜這樣的程序在VC6中無法通過編譯,似乎VC6不支持將novirtual member function聲明成templates,但是VC7可以。這裡地方需要注意四點技術:
(1)函數調用的自變量匹配規則
(2)隱式型別轉換函數
(3)template functions的暗自具現化
(4)member function templates。我承認,這有點太深入了。
在智能指針中const和non-const之間的轉化也是很大的學問,我看了Meyers使用unions來做實現。這不是我喜歡的做法,我覺得風險還是比較大的。
Smart Pointer值得使用麼?這不是我可以回答的問題,然而在以往的經驗中,我似乎很少用到。也許是我的孤陋造成了這樣的局面,但在更深層次來說,我需要閱讀更多的Smart Pointer的實現。而且更加重要的是需要學會對Smart Pointer的調試,這似乎並不簡單。