MoreEffectiveC++之智能指針

字號(hào):

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