自身特化的模板類 奇異迴圈模板

2021-08-15 06:58:16 字數 2196 閱讀 8271

考慮如下**:

templateclass cbase

;class cdriver : public cbase

上面的**出現了2個問題:

1.   模板類的t,在整個模板類中並沒有用到

2.   派生類以特化的模板類作基類,但是卻用自身特化

實際上,這兩個問題是為了實現同乙個功能:

cbase是個模板類,但其有個static成員函式指標。那麼:

class cdrivera    : public cbase

class cdriverb    : public cbase

如果是這樣的**,cdrivera與cdriverb會從同乙個特化模板派生,則cdrivera與cdriverb會共享這個static成員函式指標。若不希望共享,可以採用這樣的方式:

class cdrivera    : public cbase

class cdriverb    : public cbase

這樣,cdrivera與cdriverb會從不同特化模板派生,從而cdrivera與cdriverb不共享這個static成員函式指標。

而實際上,由於t型別並沒有在模板中使用,因此編譯時這個t是什麼並不重要。

於是:class cdrivera    : public cbase

class cdriverb    : public cbase

這樣的**是合法的,並且其特化模板不同,從而cdrivera與cdriverb不共享這個static成員函式指標。

這就是用template實現多型的方法。

實際上,在模板類中,只要不涉及t的「實際實現」,即便**中有t也是可以的。

不涉及實際實現的情況有以下幾個:

1.   t作函式返回值,包括t&與t*

2.   t作函式成員變數,一定要是t*

示例**:定義乙個單件父類,從而派生類都是單件:

templateclasssingleton

; singleton(constsingleton&){};

singleton&operator=(constsingleton&){};

~singleton();

public:

statict&getinstance();

statict*getinstanceptr();

private:

statict* _instance;

};templatet*singleton::_instance=nullptr;

templatesingleton::~singleton()

}templatet&singleton::getinstance()

return*_instance;

}templatet*singleton::getinstanceptr()

return_instance;

}

在派生類中:

#include"singleton.h"

class myclass : public singleton

private:

myclass() {};

//myclass(constmyclass&) {};

//myclass& operator =(constmyclass&) {};

~myclass() {};

friend singleton;

//friend class auto_ptr;

}

上述**就是乙個奇異迴圈模板及其派生類。

注意:1.   模板類的建構函式,拷貝建構函式,=運算子和析構函式不可以為private,因為private函式不能被派生類訪問。考慮到是單件,定義為public並不合適,故定義為protected最合適。

2.   派生類中,由於是迴圈模板,所以相當於是令基類訪問自身,所以要新增:

friend singleton;

這樣,基類就可以訪問自身。

3.   派生類無法再派生。

4.   實際上,派生類的建構函式,拷貝建構函式,=運算子和析構函式都可以不再定義。

注意上面的**僅適用於單執行緒。若要在多執行緒下使用,需要在getinstance

()函式中引入加鎖和雙檢測機制。

類模板的特化,偏特化

class templates 的特化 specializations 你可以針對某些特殊的模板引數,對乙個類模板進行特化。類模板的特化與函式模板的過載類似,使你得以針對某些特定型別進行 優化,或修正某個特定型別在函式模板具現化中的錯誤行為。然而如果你對乙個類模板進行特化,就必須特化其所有成元函式。...

類模板的偏特化

class templates 可以被偏特化 partial specialized,或稱部份特化 區域性特化 這使你得以在特定情形下使用特殊實作碼,但仍然留給你 使用者 選擇 template parameters 的能力。例如對於下 面的 class template template clas...

模板的特化

首先要再提一下什麼是模板,模板有什麼作用?模板是泛型程式設計的基礎。所謂泛型程式設計是編寫與型別無關的邏輯 是一種復用的方式,模板分為模板函式和模板類。編譯呼叫模板函式或模板類時,編譯器會根據傳遞的引數自動推演出模板形參的型別,並自動生成對應的 這是前面我們已經提到過的,下面我們來了解一下模板的特化...