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 小結 對於函式模板和類模板,模板引數並不侷限於型別,普通值也可以作為模板引數。在基於型別引數的模板中,你定義了一些具體細節未加確定的 直到 被呼叫時這些細節才被真正確定。然而,在...