C Templates 模板中的名稱

2021-05-25 19:04:10 字數 2292 閱讀 4243

名稱的分類:

識別符號、運算子id、型別轉換函式id、模板id、非受限id、受限id、受限名稱、非受限名稱、依賴性名稱、非依賴性名稱

如果乙個名稱使用域解析運算子或者成員訪問運算子來顯式表明它所屬的作用域,就稱該名稱為受限名稱。

如果乙個名稱依賴於模板引數,就稱為依賴性名稱。

名稱查詢:

受限名稱的名稱查詢是在乙個受限作用域內部進行的,該受限作用域由乙個限定的構造所決定,如果該作用域是乙個類,那麼查詢範圍可以到達它的基類;但不會考慮它的外圍作用域。

非受限名稱的查詢則相反,可以在所有外圍類中逐層地進行查詢(但在某個類內部定義的成員函式定義中,它會先查詢該類和基類的作用域,然後才查詢外圍類的作用域)

adl(argument-dependent lookup)依賴於引數的查詢:

adl只能應用於非受限名稱。

唯一例外情況是:忽略using指示符

#include

namespace x

namespace n ;

void f(e)

}void f(int)

int main()

友元名稱插入:

template

class c ;

void g(c* p)

c++標準規定:

通常,友元宣告在外圍(類)作用於中是不可見的。

如果友元函式所在的類屬於adl的關聯類集合,那麼在這個外圍類是可以找到該友元宣告的。

對於涉及在關聯類中友元查詢的呼叫,會導致該關聯類被例項化,如f(*p)。

插入式類名稱:

如果在類本身的作用於中插入該類的名稱,就稱該名稱為插入式類名稱。

#include

int c;

class c

};int f()

int main()

在類模板中使用插入式名稱,和普通插入式類名稱有些區別:它們的後面可以緊跟模板實參

template class tt> class x ;

template class c ;

解析模板:

maximum munch掃瞄原則:c++實現應該讓乙個標記具有盡可能多的字元。

通常,依賴型受限名稱並不會代表乙個型別,除非在該名稱的前面有關鍵字typename字首。

當型別名稱具有以下性質時,就應該在該名稱前面新增typename字首:

1.名稱出現在乙個模板中

2.名稱是受限的

3.名稱不是用於指定基類繼承的列表中,也不是位於引入建構函式的成員初始化列表中

4.名稱依賴於模板引數

只有當前面3個條件同時滿足的情況下,才能使用typename字首。

template

struct s : typename x::base     //第乙個typename不滿足規則3

typename xf()

typename x::c * s;        //可選,不滿足規則4

};struct u ;

上面紅色標註的typename是不必使用的。

如果限定符號前面的名稱(或者表示式)的型別要依賴於某個模板引數,並且緊接在限定符後面的是乙個template-id(乙個後面帶有尖括號內部實參列表的模板名稱),那麼就應該使用關鍵字typename。

using指示符可以讓以前不能訪問發成員現在變成可訪問的:

class bx ;

class dx : private bx ;

如果期望使用using指示符所引入的依賴型名稱是乙個型別,必須插入關鍵字typename來顯式指定:

template

class bxt ;

template

class dxtt : private bxt;

派生和類模板:

非依賴型基類:

template

class base ;

class d1 : public base>

};template

class d2 : public base

t strange;    //此處先查詢非依賴型基類再查詢模板引數列表,此處t一直都會是base::t 中對應的t型別(int),而不會是模板引數列表中的t

};依賴型基類:

對於模板中的非依賴型名稱,將會在看到的第一時間進行查詢,但不會在依賴型基類中進行查詢。

在允許使用this->字首的地方都使用this->字首。

如果不斷重複的限定會讓****觀,可以在派生類中只引入依賴型基類中的名稱一次:

template

class d3 : public base

};

C Templates 模板的多型威力

多型主要是通過繼承和虛函式來實現的,這兩個機制都是在執行期進行處理的,因此把這種多型稱為動多型。平常所談論的c 多型指的就是這種動多型。模板也允許使用單一的泛型標記來關聯不同的特定行為,這種借助於模板的關聯是在編譯器進行處理的,因此把這種多型稱為靜多型。動多型 動多型的設計思想主要在於 對於幾個相關...

C Templates 模板實戰

包含模型 把模板的定義包含在宣告模板的標頭檔案裡面,即讓定義和宣告都位於同乙個標頭檔案中。如果不需要考慮建立期的時間問題,建議盡量使用包含模型來組織模板 非內聯函式模板在呼叫的位置並不會被擴充套件,而是當它們基於某種型別進行例項化之後,才產生乙份新的 基於該型別的 函式拷貝。顯式例項化 顯式例項化指...

C Templates 深入模板基礎

引數化宣告 存在3種模板引數 1.型別引數 2.非型別引數 3.模板的模板引數 非型別引數 非型別引數表示的是 在編譯期或鏈結期可以確定的常值,這些引數的型別必須是下面的一種 非型別模板引數的宣告和變數的宣告很相似,但它們不能具有static mutable等修飾符 只能具有const和volati...