《深入實踐C 模板程式設計》之三 模板引數型別詳解

2022-03-22 16:18:22 字數 3169 閱讀 7423

非型別模板引數 和 模板型模板引數

整數以及列舉型別;指向物件或者函式的指標;對物件或函式的引用;指向物件成員的指標。統稱為非型別模板引數。

模板型模板引數,是指模板引數還可以是乙個模板。

1、整數模板引數

非型別模板引數的作用相當於為函式模板或類模板預定義一些常量,在生成模板例項時,也要求必須以常量即編譯期已知的值為非型別模板引數賦值。//就是模板中有乙個引數,但它並不是模板引數,並不會適配不同的型別,而是某種固定的型別 那麼他的好處在哪?「模板中宣告的常量,在模板的所有例項中都具有相同的值,而非型別模板引數則對於在不同的模板例項中擁有不同的值來滿足不同的需求」。這句話說得太官方了,我們來看個例子:

templateclass

carray

else

}};

這個例子存在什麼問題?問題就在於陣列的大小被寫死了,這個模板在編譯器只能靈活適配不同的陣列型別,但是無法適配不同的陣列大小。但是如果改成這樣,就會靈活很多:

1 template2

class

carray2312

else

1316

}17 };

讓我們來驗證一下,非型別模板引數size的值不同,是否產生的是不同的函式例項,稍微改造一下函式如下:

templateclass

carray2

~carray2(){}

t elems[size];

public

:t& operator(unsigned i) throw

(std::out_of_range)

else}

public

:static

intid;};

template

int carray2::id = 0; //

順便我們也應該了解這種帶有非型別模板引數的模板類如何定義乙個static成員

void

main()

執行結果如下:

2、函式指標模板引數

前面一小節,在模板引數中固定寫死了某種資料型別,這裡我們也可以在定義模板時固定寫死某種函式引數型別。而這個函式引數型別又可以適配模板中的模板引數型別。

1 templatevoid(*f)(t &v)>

2void

foreach

(t array, unsigned size)38

}910 template11

void inc(t &v)

1213 template14

void dec(t &v)

1516 template17

void print(t &v)

1819

void

main()20;

22foreach

>(array, 8

);23

24foreach

>(array, 8

);25

26getchar();

27 }

3、指標及引用模板引數

只有指向全域性變數及外部變數及類靜態變數的指標及引用才可以作為模板引數。函式的區域性變數、類成員變數等均不能作為模板引數。因為模板引數值必須是編譯時已知的。

1 template

2struct35

void

set(int v)67

};89 template

10struct

1113

void

set(int v)

14};

1516

int global_variable = 0;17

18int

main()

19

之前我們講述的是用typename t來區分兩個模板例項,但是這裡的乙個指標、乙個整形常量(統稱非模板型模板引數)就可以直接區分模板例項:

1 template

2struct37

void

set(int v)

8public:9

static

intid;

10};;12

13int global_variable = 0;14

int global_variable3 = 0;15

16int

main()

17

4、成員函式指標模板引數

class

some_value

int add_by(int op)

int sub_by(int op)

int mul_by(int op)};

typedef

int (some_value::* some_value_mfp)(int);

template

int call(some_value &value, int op)//

*是必要的,否則會認為是在使用value類的成員func

void

main()

5、模板型模板引數

首先我有三個模板:

templatestruct

inc};

template

struct

dec};

template

struct

print

};

這三個模板決定了foreach生成不同的例項(當然還有foreach本身的第二個模板引數),這裡注意只有類模板可以作為模板引數,所以這裡只能用class而不能用struct:

templateclass func, typename t>

void

foreach

(t array, unsigned size)

}

在foreach中使用第乙個模板 or 在foreach中使用第二個模板 or 在foreach中使用第三個模板?都有可能!所以要在foreach中新增乙個模板引數用來決定使用哪個模板,這就是模板的模板,也就是模板型模板引數。

void

main()

;foreach

(array, 7

);foreach

(array, 7

);foreach

(array, 7);

getchar();

}

深入模板程式設計筆記三

函式指標模板 templatevoid foreachf t array,int size templatevoid inc t v templatevoid dec t v void main foreachf arrary,4 system pause return 傳人的是任意引數型別的函式指...

C 程式設計之函式模板

c 程式設計之函式模板 1 函式之模版出現 在調換兩個數值之間的函式寫法上,由於有int float double等不同的資料型別,如下例 void swapvalues int num1,int num2 上例只能適合於int 型別的變數,假如要呼叫double型別的兩個數調換,又要重寫上面的函式...

C 物件導向程式設計之模板

1 提高程式可重用性的兩種辦法 繼承 泛型程式設計 模板 2 模板的例項化 編譯器根據模板自動生成函式的過程稱為模板的例項化。3 函式模板的形式 template返回值型別 模板名 形參表 4 函式模板的一些特點 函式的模板中可以有不止乙個型別引數 template t2 print t1 arg1...