C Template 基礎篇(四) 模板與友元

2021-07-28 08:04:06 字數 2999 閱讀 9144

template所代表的泛型程式設計是c++語言中的重要的組成部分,我將通過幾篇blog對這半年以來的學習做乙個系統的總結,本文是基礎篇的第四部分。

類模板的普通類友元

類模板的類模板友元

函式友元

類模板的函式友元

類模板的函式模板友元

模板引數友元

類模板之間、類模板與普通類之間共有三種友元的形式:

友元普通類

類模板普通類

不在討論範圍內

類模板友元

類模板類友元

類模板的類模板友元

一對一關係

可以將類模板的乙個例項宣告為普通類的友元。

template

class pal

};class hasfriend

};hasfriend hf;

pal::call(hf); //pal是hasfriend的友元

一對多關係

也可以把類模板宣告為類的友元模板,這意味著這個類模板的所有例項都是類的友元。宣告時要使用template和class關鍵字(這一點和模板的模板引數很像)。

template

class pal;

class hasfriend

};template

class pal

};hasfriend hf;

pal::call(hf); //pal是hasfriend的友元

pal::call(hf); //pal是hasfriend的友元

可以將乙個普通類宣告為類模板的友元。

class pal;

template

class hasfriend

};class pal

};pal::call(); //pal是hasfriend的友元

一對一關係

可以通過共享型別引數t,在類模板與類模板友元之間達成一對一的關係。

template

class pal;

template

class hasfriend

};template

class pal

};pal::call(); //pal是hasfriend的友元

多對多關係

為類模板友元宣告乙個不同的型別引數,可以達到多對多關係,也就是說template b的所有例項都是template a的所有例項的友元。

template

class pal;

template

class hasfriend

};template

class pal

};pal::call(); //pal是hasfriend的友元

pal::call(); //pal是hasfriend的友元

類(類模板)與函式(函式模板)之間共有三種友元的形式:

友元普通函式

函式模板

普通類不在討論範圍內

函式模板友元

類模板函式友元

類模板的函式模板友元

一對一關係

可以將函式模板的乙個例項宣告為普通類的友元。

template

void call(t& t)

class hasfriend

};hasfriend hf;

call(hf); //ok, void call(hasfriend&)是hasfriend的友元

一對多關係

也可以把函式模板宣告為類的友元模板,這意味著這個函式模板的所有例項都是類的友元。宣告時注意要使用template關鍵字。

template

void call(t& t, u& u)

class hasfriend

};hasfriend hf;

int i = 1;

call(i, hf); //void call(int&, hasfriend&)是hasfriend的友元,注意這裡的型別自動推導

double d = 2.0;

call(d, hf); //void call(double&, hasfriend&)是hasfriend的友元,注意這裡的型別自動推導

可以將乙個普通函式宣告為類模板的友元,這樣,這個普通函式就是這個類模板的所有例項的友元。

void call();

template

class hasfriend

};void call()

call();

一對一關係

可以通過共享型別引數t,在類模板與函式模板友元之間達成一對一的關係。

template

void call(const t& t);

template

class hasfriend

};template

void call(const t& t)

call(1); //ok,共享同乙個型別實參int

多對多關係

為函式模板友元宣告乙個不同的型別引數,可以達到多對多關係。

template

void call(const t& t);

template

class hasfriend

};template

void call(const t& t)

call(1.0f); //call是hasfriend的友元

call(2.0); //call是hasfriend的友元

在c++11中,我們還可以將模板型別引數宣告為友元。

template

class hasfriend

};class pal

};pal::call();

C Template 基礎篇(二) 類模板

template所代表的泛型程式設計是c 語言中的重要的組成部分,我將通過幾篇blog對這半年以來的學習做乙個系統的總結,本文是基礎篇的第二部分。類模板tips 特化與偏特化 類模板也是公共邏輯的抽象,通常用來作為容器 例如 vector 或者行為 例如 clonable 的封裝。下面定義了乙個pr...

C Template 基礎篇(三) 引數魔法

template所代表的泛型程式設計是c 語言中的重要的組成部分,我將通過幾篇blog對這半年以來的學習做乙個系統的總結,本文是基礎篇的第三部分。除了使用型別作為模板的引數之外,模板引數有更多的用法,以下做個詳細介紹。我們可以通過給模板指定預設實參,為使用者推薦合適的預設設定,讓使用者在只指定部分 ...

C Template 基礎 非型別模板引數

目錄 4 非型別模板引數 4.1 非型別的類模板引數 4.2 非型別的函式模板引數 4.3 非型別模板引數的限制 4.4 小結 對於函式模板和類模板,模板引數並不侷限於型別,普通值也可以作為模板引數。在基於型別引數的模板中,你定義了一些具體細節未加確定的 直到 被呼叫時這些細節才被真正確定。然而,在...