泛型程式設計與物件導向程式設計的目標相同,即使重用**和抽象通用概念的技術更加簡單。但是物件導向程式設計強調程式設計的資料方面,泛型程式設計強調的是獨立於特定資料型別。
這一篇介紹一下 c++ 程式設計中與物件導向並列的另一大分支——泛型程式設計,這一篇主要介紹函式模板、類模板和成員模板三大部分
如有侵權,請聯絡刪除,如有錯誤,歡迎大家指正,謝謝
泛型程式設計
模板是泛型程式設計的一種重要思想,stl(standard template library,標準模板庫)是採用模板實現的乙個例項
函式模板
對比函式過載(同一作用域內函式名相同,引數列表不同的函式),函式模板只需要乙個函式就實現了函式過載的部分功能(引數個數相同型別不同,函式過載需要定義多個同名引數列表不同的函式)
template // 這也可以寫 template 此處的 class 和 typename 作用相同
void tfunc(t& t, y& y)
int n = 2;
double d = 程式設計客棧2.1;
tfunc(n, d);
// 執行結果:2 2.1
函式模板具體化,函式模板具體化就是將某一(某幾)個要處理的型別單獨處理,需要單獨寫乙個實現,形式是 template<> void fun(type& t);,函式模板www.cppcns.com的具體化和普通函式可以同時存在,呼叫順序是 普通函式 > 函式模板具體化 > 模板函式
// *****= 測試一:函式模板針對特殊資料型別具體化 *****=
struct node ;
// 函式模板
template
void tfunc(const t& t)
// 函式模板具體化(用於處理node型別資料)
template<>
void tfunc(const node& node)
// 函式模板具體化(用於處理int型別資料)
template<>
void tfunc(const int& n)
// 普通函式
void tfunc(const int& n)
double d = 2.1;
tfunc(d); // 函式模板未具體化double型別函式,呼叫模板
node node;
tfunc(node); // 函式模板具體化node型別函式,呼叫函式模板的具體化
int n = 2;
tfunc(n); // 函式模板具體化int型別函式,也存在普通函式,呼叫普通函式
// *****= 測試二:函式模板部分具體化 *****=
template
void tfunc(t1 t1, t2 t2)
template
void tfunc(long l, t2 t2)
template<>
void tfunc(short l, int i)
// 分別呼叫以上四個模板函式
tfunc(char('c'), char('c'));
tfunc(char('c'), int(10));
tfunc(long(10), char('c'));
tfunc(short(10), int(10));
函式模板例項化,讓編譯器生成指定型別的函式定義,不用寫函式的實現,形式是 template void fun(type& t);
// 函式模板
template
void tfunc(const t& t)
// 函式模板例項化,不用寫函式的實現,編譯器會生成該型別的模板具體化函式
template void tfunc(const char& c);
類模板類模板可以指定預設模板引數(函式模板不可以),跟函式引數的預設值一樣,必須從右向左連續賦值預設型別,如果例項化物件時又傳遞了型別,預設型別會被覆蓋掉,跟函式引數是一樣的
建立物件時需要傳遞模板引數列表,模板引數列表加在類名後面 classname< typename t > classn; 如果類的模板引數列
表有預設值,可以不傳模板引數,但一定要加 <> 如 classname< > classn; 建立堆區物件的時候,所有的類名稱後面都要加模板引數列表,如 classname< typename t >* classn = new classname< typename t>; 除了類內,其他地方出現 classname 的地方一般都要加模板引數列表
template // 此處指定了模板預設引數,部分指定必須從右到左指定
class test
void tfunc();
private:
t t;
y y;
};template // 類模板的函式在類外實現,需要加上模板引數列表,但不需要加指定的預設模板引數
void test::tfunc()
int n = 2;
double d = 2.1;
test test(n, d); // 此處如果使用預設模板引數可定義為 test《程式設計客棧》 test(int(2), char('a'));
test.tfunc();
// 執行結果:2 2.1
類模板的繼承,類模板被繼承後引數的傳遞方式主要有兩種,一種是直接在子類繼承父類的時候,為父類指定固定的型別,二是通過子類模板引數列表傳遞
// *****= 測試一 *****=
template
class a
};class test : public a
};test();
// *****= 測試二 *****=
template
class a
};template
class test : public a
};test(int(2), double(2.1), char('a'));
類模板的多型,在建立物件時,分為子類沒有模板(cfather*cf = new cson;)和子類有模板(cfather *cf = new cson)兩種,子類和父類的模板引數列表可以不一樣,但一定要對應好
// *****= 測試一 *****=
template
class a ;
class test : public a
};// 父類是類模板,子類是普通類,在多型情況下父類需要指定模板引數,子類就不用了
a* a = new test;
a->tfunc(2, 2.1);
// 執行結果:2 2.1
// *****= 測試二 *****=
template
class a ;
template
class test : public a
};// 父類是類模板,子類是類模板,在多型情況下父類和子類都需要指定模板引數
a* a = new test;
a->tfunc(2, 2.1);
// 執行結果:2 2.1
類模板具體化,類模板的具體化分為部分具體化和全部具體化兩種
template
class test
};// 部分具體化
template
class test
};// 部分具體化
template
class test
};// 全部具體化
template<>
class test
};// 分別建立上面四個類
test();
test();
test();
test();
成員模板
成員模板簡單說就是模板中的模板
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)
};pair(pair(new test1, new test2));
如果未特殊說明,以上測試均是在win10 vs2017 64bit編譯器下進行的
總結本文標題: c++ 泛型程式設計詳解
本文位址:
C 泛型程式設計詳解
1 模板 模板是泛型程式設計的重要思想,也是c 的精髓之一,c 的stl庫完全通過模板實現 關於stl有興趣的可以去研究一下這個開源專案 對比函式過載,函式模板只需要通過一次函式定義就可以實現不同引數列表和引數型別的函式過載功能,下面是個簡單的模板函式。include include using n...
C 泛型詳解
泛型就是將型別做引數的技術!詳細一點來說就是 泛型就是就是使用型別引數定義的資料型別或方法。平常使用list的時候,我們就在不知不覺中已經使用了泛型。泛型的語法有倆種.第一種是在類名後面加上 class my 第二種是在方法名後面加上 csharp class your 倆種格式都可以,看個人愛好呼...
c 泛型程式設計
對於兩個不同的概念a和b,如果概念a所需求的所有功能也是概念b所需求的功能,那麼就說概念b是概念a的子概念。例如 標準模板庫 standard template library,簡稱stl 提供了一些非常常用的資料結構和演算法 將函式物件作為演算法的引數而不是將函式所執行的運算作為演算法的一部分。使...