C++ 中的模板

類模板

template <typename T>
class A{
private:
    T x;
};

函數(shù)模板

template <typename T>
inline
const T& my_min(T& x, T& y) {
    return x < y ? x : y;
}

成員模板(member template)

成員模板其實(shí)就是一個類里面使用了一個模板函數(shù)延曙。使用模板函數(shù)的時候是不需要指定參數(shù)類型的蹄溉。

來看這個例子:

#include <iostream>
#include <vector>
#include <algorithm>
 
struct Printer { // generic functor
    std::ostream& os;
    Printer(std::ostream& os) : os(os) {}
    template<typename T>
    void operator()(const T& obj) { os << obj << ' '; } // member template
};
 
int main()
{
    std::vector<int> v = {1,2,3};
    std::for_each(v.begin(), v.end(), Printer(std::cout));
    std::string s = "abc";
    std::for_each(s.begin(), s.end(), Printer(std::cout));
}

結(jié)果:

1 2 3 a b c 

模板特化(specialization)

其實(shí)是對模板的某一種特定類型的解釋沿后,比如下面這個例子:

#include <iostream>
#include <algorithm>

using std::cout;

template <typename T>
size_t hash(const T& x){
    return 0;
}

template <>
size_t hash(const char& x){
    return x;
}

int main() {
    char x1 = 'a';
    int x2 = 3;

    cout << "x1(char) hash: " << hash(x1) << '\n';
    cout << "x2(int) hash: " << hash(x2) << '\n';
}

模板偏特化

個數(shù)的偏

對于有多個模板參數(shù)趋急,我們可以選擇一個或者多個指定類型绍傲。比如看到 vector 的實(shí)現(xiàn):

template<typename T, typename Alloc=...>
class vector
{
  ...
}

特化第一個 typename:

template<typename Alloc=...>
class vector<bool, Alloc>
{
  ...
}

范圍的偏(partial specialization)

template <typename T>
class C
{
  ...
}

可以指定 T 是指針规哲,應(yīng)該怎么做:

template <typename T>
class C<T*>
{
  ...
}

具體用法就是:

C<string> obj1;
C<string*> obj2;

模板模板參數(shù)

這個比較難理解,我先舉這樣一個例子乃沙。假如我們需要這樣一個類起趾,它的成員變量有一個 std::list,list 的類型是 int警儒。那么我們可以這樣寫:

class A{
private:
    std::list<int> l1;
};

那這個類能不能更通用化呢训裆?list 的類型可以由用戶指定呢眶根?

那么我們可以這么寫:

template <typename T>
class A{
private:
    std::list<T> l1;
};

再通用化一點(diǎn),把 list 換成任意容器边琉,且這個容器存儲的東西也由用戶指定属百。

那么我們就可以這樣寫:

#include <iostream>
#include <list>

template<typename T, template<typename U, typename Alloc>class Container>
class A{
private:
    Container<T, std::allocator<T>> c;
};

int main() {

    A<int, std::list> a;

    return 0;
}

其中上面第二個模板參數(shù)就是模板模板參數(shù)。

再看下面這個是不是模板模板參數(shù):

template <class T, class Sequence = std::deque<T>>
class A{
    
};

這個就不是了变姨,我們在使用的過程中要指定具體的類型族扰,而不是模板。比如:

A<int> a;
A<int, std::list<int>> a;

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末定欧,一起剝皮案震驚了整個濱河市渔呵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌砍鸠,老刑警劉巖扩氢,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異爷辱,居然都是意外死亡录豺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門托嚣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來巩检,“玉大人,你說我怎么就攤上這事示启【た蓿” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵夫嗓,是天一觀的道長迟螺。 經(jīng)常有香客問我,道長舍咖,這世上最難降的妖魔是什么矩父? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮排霉,結(jié)果婚禮上窍株,老公的妹妹穿的比我還像新娘。我一直安慰自己攻柠,他們只是感情好球订,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瑰钮,像睡著了一般冒滩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上浪谴,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天开睡,我揣著相機(jī)與錄音因苹,去河邊找鬼。 笑死篇恒,一個胖子當(dāng)著我的面吹牛扶檐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播婚度,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼蘸秘,長吁一口氣:“原來是場噩夢啊……” “哼官卡!你這毒婦竟也來了蝗茁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤寻咒,失蹤者是張志新(化名)和其女友劉穎哮翘,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體毛秘,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饭寺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了叫挟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片艰匙。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖抹恳,靈堂內(nèi)的尸體忽然破棺而出员凝,到底是詐尸還是另有隱情,我是刑警寧澤奋献,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布健霹,位于F島的核電站,受9級特大地震影響瓶蚂,放射性物質(zhì)發(fā)生泄漏糖埋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一窃这、第九天 我趴在偏房一處隱蔽的房頂上張望瞳别。 院中可真熱鬧,春花似錦杭攻、人聲如沸祟敛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垒棋。三九已至,卻和暖如春痪宰,著一層夾襖步出監(jiān)牢的瞬間叼架,已是汗流浹背畔裕。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乖订,地道東北人扮饶。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像乍构,于是被迫代替她去往敵國和親甜无。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 技術(shù)交流QQ群:1027579432哥遮,歡迎你的加入岂丘! 1.Cpp中的模板template 模板是泛型編程的基礎(chǔ),泛...
    CurryCoder閱讀 1,391評論 0 2
  • 一眠饮、概述 二奥帘、模板定義與使用 ?1. 函數(shù)模板的定義與使用?2. 類模板的定義與使用 三、typename 的特殊...
    從不中二的憂傷閱讀 1,660評論 1 1
  • Hi仪召!這里是山幺幺的c++ primer系列寨蹋。寫這個系列的初衷是,雖然在學(xué)校學(xué)習(xí)了c++扔茅,但總覺得對這門語言了解不...
    山幺幺閱讀 423評論 0 1
  • 模板主要包括函數(shù)模板和類模板這兩種已旧。函數(shù)模板技術(shù)定義了參數(shù)化的非成員函數(shù),這使得程序能夠使用不同的參數(shù)類型調(diào)用相同...
    小帥灬血閱讀 491評論 0 2
  • 1. 基本概念 1.1 什么是模板召娜? 模板(Template)是允許函數(shù)或者類通過泛型(generic types...
    jdzhangxin閱讀 1,689評論 2 1