1、模板:模板是泛型程式設計的重要思想,也是c++的精髓之一,c++的stl庫完全通過模板實現(關於stl有興趣的可以去研究一下這個開源專案:[對比函式過載,函式模板只需要通過一次函式定義就可以實現不同引數列表和引數型別的函式過載功能,下面是個簡單的模板函式。
#include #include using namespace std;
templatevoid tfunc_1(t &t, y &y)
t tfunc_2(t &t)
int main()
// 執行結果:
// t:i 2
// y:d 3.5
// 3
// 說明:使用typeid().name()返回變數型別,i表示int,d表示double,依此類推.
2、函式模板具體化:函式模板具體化是指如果要將某乙個或某幾個要處理的資料型別進行單獨處理,需要額外定義對應資料型別的模板函式,形式是「 template <> void fun(type &t); 」,函式模板具體化和普通函式可同時存在,呼叫順序為——普通函式 > 函式模板具體化 > 模板函式,這就類似於在類之外實現"多型"。下面給出乙個函式模板具體化的例子。
#include #include using namespace std;
struct node
};// 模板函式
template void tfunc(t &t)
// 函式模板具體化(用於處理node型別)
template <>
void tfunc(node &node)
// 普通函式
void tfunc(int &a)
int main()
// 輸出:
// tt:2.1
// tfunc():1
// tnode val:2
3、函式模板例項化:讓編譯器生成指定型別函式定義,不用定義函式實現,例項化示例為「template void fun(type &t);」,下面是乙個簡單的例子。(詳細可參考[
// 說明:在函式呼叫時可直接顯示例項化,而不適用顯示例項化宣告.
#include #include using namespace std;
template void tfunc(t &t)
int main()
// 輸出:tt:c a
1、類模板可以指定預設模板引數(函式模板不可以),跟函式引數的預設值一樣,必須從右向左連續賦值預設型別,如果例項化物件時又傳遞了型別,則預設型別會被覆蓋掉,跟函式引數是一樣的。建立物件時需要傳遞模板引數列表,模板引數列表加在類名後面classname ; 如果類的模板引數列表有預設值,可以不傳模板引數,但一定要加 <> 如 classname< > classn; 建立堆區物件的時候,所有的類名稱後面都要加模板引數列表,如 classname< typename t >* classn = new classname< typename t>; 除了類內,其他地方出現 classname 的地方一般都要加模板引數列表。下面是個簡單的類模板示例。
#include #include using namespace std;
template class test
void tfunc();
};template // 類模板的函式在類外實現,需要加上模板引數列表,但不需要加指定的預設模板引數
void test::tfunc() // 類外使用test需要加模板引數
int main()
// 輸出:2 2.1
2、類模板的繼承:類模板被繼承後引數的傳遞方式主要有兩種,一種直接在子類繼承父類的時候,為父類指定固定的型別,二是通過子類模板引數列表傳遞。下面是乙個類模板繼承的簡單示例。
template class a
};class test: public a// 父類是類模板,子類是普通類
};main()
/*****************************************/
template class b
};template // 父類為類模板,子類為類模板
class test: public a
};main()
更多繼承關係參考:[
3、類模板的多型:在建立物件時,分為子類沒有模板(cfather*cf = new cson;)和子類有模板(cfather*cf = new cson)兩種,子類和父類的模板引數列表可以不一樣,但一定要對應好。下面是個簡單的示例。
#include using namespace std;
templateclass a
;class test: public a
};// 父類是類模板,子類是普通類,在多型情況下只有父類需要指定模板引數
int main()
// 輸出:2 2.1
#include using namespace std;
templateclass a
;template class test : public a
};// 父類是類模板,子類是類模板,在多型情況下父類和子類都需要指定模板引數
int main()
// 輸出:2 2.1
4、類模板具體化:類模板具體化分為部分具體化和全部具體化,如下.
#include using namespace std;
template class test
};// 部分具體化
template class test
};// 部分具體化
template class test
};// 全部具體化
template <>
class test
};// 父類是類模板,子類是類模板,在多型情況下父類和子類都需要指定模板引數
int main()
/* 輸出:
* t1 and t2
* t1 and int
* long and t2
* long and int
*/
成員模板簡單來講就是模板中的模板,常見於模板類中構建模板函式,詳細可參考:[下面給出乙個簡單的示例:
#include class base1 {};
class base2 {};
class test1 : public base1 {};
class test2 : public base2 {};
template class pair
// 類模板中的成員模板
template pair(const pair&pair) : t1(pair.t1), t2(pair.t2) {}
};int main()
C 泛型程式設計詳解
泛型程式設計與物件導向程式設計的目標相同,即使重用 和抽象通用概念的技術更加簡單。但是物件導向程式設計強調程式設計的資料方面,泛型程式設計強調的是獨立於特定資料型別。這一篇介紹一下 c 程式設計中與物件導向並列的另一大分支 泛型程式設計,這一篇主要介紹函式模板 類模板和成員模板三大部分 如有侵權,請...
C 泛型詳解
泛型就是將型別做引數的技術!詳細一點來說就是 泛型就是就是使用型別引數定義的資料型別或方法。平常使用list的時候,我們就在不知不覺中已經使用了泛型。泛型的語法有倆種.第一種是在類名後面加上 class my 第二種是在方法名後面加上 csharp class your 倆種格式都可以,看個人愛好呼...
c 泛型程式設計
對於兩個不同的概念a和b,如果概念a所需求的所有功能也是概念b所需求的功能,那麼就說概念b是概念a的子概念。例如 標準模板庫 standard template library,簡稱stl 提供了一些非常常用的資料結構和演算法 將函式物件作為演算法的引數而不是將函式所執行的運算作為演算法的一部分。使...