1. 程式人生 > >C++模板的特化(函式模板特化,類模板特化)與例項化區別聯絡

C++模板的特化(函式模板特化,類模板特化)與例項化區別聯絡

一:例項化什麼是例項化:一個通過使用具體值替換模板引數,從模板產生的普通類,函式的過程1.顯示例項化:通過指定的型別,表明要例項化的型別

2.隱式例項化:通過編譯器自己推演,判斷出要例項化的型別 

二 :特化=具體化類模板特化類模板
template<class T1,class T2>
class Date
{
public:Date()
{
		   cout << "Date(T1,T2)" << endl;
}
private:
	T1 _a;
	T2 _b;
};
template<class T1, class T2>
class Date
{
public:Date();
private:
	T1 _a;
	T2 _b;
};
template<class T1,class T2>
Date<T1, T2>::Date()
{
	cout << "Date(T1,T2)" << endl;
}

類模板全特化
template<class T1,class T2>//模板
class Date
{
public:Date()
{
		   cout << "Date(T1,T2)" << endl;
}
private:
	T1 _a;
	T2 _b;
};
template<>//全特化
class Date<int, char>
{
public:Date();
private:
	int _a;
	char _b;
};
//全特化在類外定義成員函式    ---------不再需要模板形參
Date<int,char>::Date()
{
	cout << "Date(int,char)" << endl;
}
int main()
{
	Date<int,char> d3;
	system("pause");
	return 0;
}

類模板偏特化  //區域性特化情況一:區域性特化第二個引數
template<class T1, class T2>
class Date
{
public:Date()
{
		   cout << "Date(T1,T2)" << endl;
}
private:
	T1 _a;
	T2 _b;
};
template<class T1>//偏特化
class Date<T1, double>
{
public:Date();
private:
	T1 _a;
	double _b;
};
template<class T1>//偏特化在類外定義類的成員函式必須加上模板形參
Date<T1, double>::Date()
{
	cout << "Date(T1, double)" << endl;
}
int main()
{
	Date<int, double> d3;
	system("pause");
	return 0;
}

情況二:區域性特化兩個引數為指標型別
template<class T1, class T2>//模板
class Date
{
public:Date();
private:
	T1 _a;
	T2 _b;
};
template<class T1, class T2>//偏特化兩個引數為指標型別
class Date<T1*, T2*>
{
public:Date();
private:
	T1 a;
	T2 b;
	T1* _a;
	T2* _b;
};

template<class T1, class T2>//偏特化在類外定義類的成員函式必須加上模板形參
Date<T1*, T2*>::Date()
{
	cout << "Date(T1*,T2*)" << endl;
}
int main()
{
	Date<int*, int*> d3;
	system("pause");
	return 0;
}
由上面例子可得到:模板全特化和偏特化都是在已定義模板的基礎上,不能單獨存在。
從情況二可看出,1.偏特化不僅僅是指特殊部分引數,2.而且針對模板引數更進一步的條件限制,設計出來的一個特化版本函式模板特化函式模板全特化注意:顯示例項化只有宣告,無定義,而特化有定義。
//===============================對於函式模板===============================================//
#define Max 125
struct work
{
	char name[Max];
	int money;
};
template<class T>
void Swap(T& a, T& b)
{
	T tmp = a;
	a = b;
	b = tmp;
}
template
void Swap<int>(int& a, int& b);//顯示例項化 無需給該函式重新編寫函式體,這只是個宣告
template <> void Swap<work>(work& a, work& b)//特化  注意與例項化區分開,必須有定義
{
	int money = a.money;
	a.money = b.money;
	b.money = money;

}

函式模板偏特化函式模板沒有偏特化,可以通過函式過載實現

相關推薦

C++模板函式模板模板例項區別聯絡

一:例項化什麼是例項化:一個通過使用具體值替換模板引數,從模板產生的普通類,函式的過程1.顯示例項化:通過指定的型別,表明要例項化的型別2.隱式例項化:通過編譯器自己推演,判斷出要例項化的型別 二 :特

C語言註釋風格函式、功能、輸入、輸出、返回

C語言程式設計規範-註釋規則: 1:一般情況下,源程式有效註釋量必須在20%以上。     說明:註釋的原則是有助於對程式的閱讀理解,在該加的地方都加了,註釋不宜太多也不能太少,註釋語言必須準確、易懂、簡潔。 2:說明性檔案(如標頭檔案.h檔案、.inc檔案、.def檔案、

Python實戰之執行緒函式多執行緒多執行緒守護執行緒GIL執行緒lock遞迴Rlock,Semaphore訊號量event

首先須知 什麼是IO? 從硬碟讀塊資料,從網路讀塊資料屬於IO操作(IO操作不佔用cpu) 計算佔用cpu,如:1+1 Python多執行緒其實就是一個執行緒,由於利用CUP的上下文切換看起來就像是併發..上下文切換消耗資源 Python多執行緒 不適合CPU密集操作型的任務,適

C++模板詳解函式模版特殊模版

模版與特化的概念 函式模版與類模版 C++中模板分為函式模板和類模板 函式模板:是一種抽象函式定義,它代表一類同構函式。 類模板:是一種更高層次的抽象的類定義。 特化的概念 所謂特化,就是將泛型的東東搞得具體化一些,從字面上

C++ 模板常見特性函式模板模板

背景 C++ 是很強大,有各種特性來提高程式碼的可重用性,有助於減少開發的程式碼量和工作量。 C++ 提高程式碼的可重用性主要有兩方面: 繼承 模板 繼承的特性我已在前面篇章寫過了,本篇主要是說明「模板」的特性。 使用「模板」的特性設計,實際上也就是「泛型」程式設計。 函式模板 01 變數交換函式模板 假

【9】C++進階系列泛型設計以及STL標準模板

1、泛型程式設計基本概念 泛型程式設計:編寫不依賴與具體資料型別的程式,將演算法從特定的資料結構中抽象出來,成為通用的。C++的模板為泛型程式設計定義了關鍵的基礎。 兩個術語:概念,模型 概念:用來界定具備一定功能的資料型別,例如:將“可以比較大小的所有資料型別(有比較

C++模板初階(泛型程式設計函式模板模板)

1.泛型程式設計 怎麼實現一個通用的交換函式呢 使用函式過載雖然可以實現,但是有一下幾個不好的地方: 1. 過載的函式僅僅只是型別不同,程式碼的複用率比較低,只要有新型別出現時,就需要增加對應的函式 2. 程式碼的可維護性比較低,一個出錯可能所有的過載均出錯

c++ 模板函式模板仿函式使用例項程式碼

1.模板函式  #include <iostream> using namespace std; template <class T> T myMin(T x, T y) { return (x < y) ? x : y; } void ma

c++中使用指標呼叫函式和使用指標呼叫物件的過載函式

使用函式指標時,指標可以像函式名一樣,直接加括號和引數列表呼叫;也可先解引用再呼叫 //include directories... using namespace std; void testFun() { cout<<"this is

c++實現雙向連結串列模板雙向連結串列

#include<iostream> #include<assert.h> using namespace std; typedef int Datatype; typedef struct Node//連結串列是由一個個節點組成所以這裡單獨定義這一型別方便在連結串列類中使用 {  

jmeter 引數函式助手對話方塊 _CVSRead 函式遇到的問題和詳解

開啟函式助手對話方塊 路徑:選項-》函式助手對話方塊 問題1:取不到值 解答: CSV file to get values from | *alias:表示要讀取的檔案路徑,應該是絕對路徑(如:

C++學習總結十一——的靜態函式成員函式的預設引數中包含引用和常量

一.類的靜態成員變數,以及靜態函式。 靜態成員變數: 1.靜態成員共享機制 2.靜態成員區域性屬於類,它不是物件的成員,位於靜態區。 3.靜態成員變數需要在外部進行初始化。 靜態函式: 1.靜態成員函式都在程式碼區,類的靜態函式都是共享的。 2.類的大小不包含程式碼區,建立

征選取2-機器學習中有哪些征選擇的工程方法?

fit fun actual 原理 歸一化 jpg arr 差異 highlight https://www.zhihu.com/question/28641663 作者:城東鏈接:https://www.zhihu.com/question/28641663/answer

函數模模板

排列 函數類 無法 round 推斷 typename 檢測 選擇 成員 函數模板特化 函數模板特化: 關鍵字template後面接一對<> 再接模板名和一對<>,尖括號中定義這個特華的模板參數 函數形參表 函數體 template <t

C語言一 資料型別、儲存、分配空間

C語言是一種移植性強,面向過程的語言,最初由丹尼斯創立,用於編寫UNIX作業系統,移植性強指的是它的程式碼通用性強。 特點:操作簡易,結構化語言,適合處理底層事件。 我的第一個C語言程式 #include <stdio.h> /*前處理器指令,在實際編譯之前執行的*

centOS7搭建好GitLab伺服器後漢圖文結合&過程可能出錯的解決方案

今天試著將安裝好的Gitlab伺服器漢化成中文,畢竟大家一起使用時,中文大家更容易上手。首先之前搭建的Gitlab步驟可以看以下部落格:  https://blog.csdn.net/JJBOOM425/article/details/83997541 伺服器原本頁面:

Python:函式:關鍵字引數誤區----正確答案:尋找函式申明中可變引數(*args)後的引數沒有可變引數*args就沒有關鍵字引數

何為一般關鍵字引數? 在定義函式時,函式體形參列表中,可變引數(*args)後不帶預設值的引數,為呼叫函式時必須賦值的關鍵字引數,即一般的關鍵字引數。 經典誤區(例) 函式體 def getValue(position1, default1 = "預設", *

c++程式設計習慣十如何處理operator=中的自我賦值問題

“自我賦值”發生在物件被賦值給自己時: class Test{...}; Test t; ... t=t;//賦值給自己 這看起來雖然有點蠢,但是是合法的,所以不要認定客戶不會那麼做。此外,賦值動作不是總是這樣一眼被看出來,例如: a[i]=a[j];//潛在的自我賦值

java double-check lazy load------effedctive java 第七十一條:慎用延遲初始這個變數的作用是確保field只在已經被初始的情況下讀取一次

private volatile FieldType field; FieldType getField(){ FieldType result = field; if(result==null){ synchronized(this){ re

SpringMvc學習心得 spring例項JavaBean的過程

     我們一般是通過呼叫一個類的建構函式完成例項化的工作,spring當然也不例外。然而相比於直接通過建構函式對類進行例項化,spring的例項化過程要複雜得多。    在之前的部落格中,本人曾經說過,任何一個JavaBean都有一個beandefinition。然而b