當前位置:首頁 » 格式模板 » c模板詳解

c模板詳解

發布時間: 2021-03-19 23:20:12

㈠ C 中為什麼用模板

(1)可用來創建動態增長和減小的數據結構
(2)它是類型無關的,因此具有很高的可復用性。
(3)它在編譯時而不是運行時檢查數據類型,保證了類型安全
(4)它是平台無關的,可移植性
(5)可用於基本數據類型

㈡ 一道c++模板題目,求詳解

T是類型參數,
T也是模板形參(有兩種模板形參:類型形參和非類型形參),
T還是模板形參表(你表項只有一項).

㈢ C++裡面的模板類是什麼

模板類英文為class template,template的中文翻譯為模板,所以模板類的意思其實是:類的模板。
顧名思義,模板類是相當於一個模具,當參數給定時,生成具體的類,也叫實例化。它的提出主要是為了減少代碼重復。
例如,我們可以用下面的代碼交換兩個數b和c
a = b;
b = c;
c = a;
這個交換過程與a,b,c的具體類型沒有關系,因此我們可以用它來交換兩個整數,或者兩個浮點數。更一般的,我們可以用來交換兩個具有賦值運算符的類型。因此,可以用模板進行一般化:
template<class T>
void swap(T &b, T &c){
a = b;
b = c;
c = a;

}
當然,上面介紹的這個不是模板類,而是模板函數。不過他們的概念是類似的。其中一開始的template代表後面尖括弧中的是模板參數(類似於函數的參數),class代表參數是類(相應的,可以用template<int N>來聲明整型參數)。後面的代碼和的函數基本沒有區別,只是用T來代替了具體的類型,例如int,double等。根據需要我們可以用swap<int>(b,c)來交換兩個整數,swap<double>(b,c)交換兩個浮點數。由於編譯器可以根據b,c的具體類型推導T的具體含義,因此可以簡寫為swap(b,c)。
回到模板類,假設我們需要一個類型來代表動態數組,且該類型支持size成員函數。如果是整型的類,我們可能會寫
class vector_int{
size_t size() const;

};
如果某一天,我們又需要浮點類型的動態數組,可能又會寫
class vector_double{
size_t size() const;

};
於是就會發現它們的代碼是如此的類似,因此我們希望將它一般化。如同swap函數的做法,我們將它定義為模板類:
template<class T>
class vector{
size_t size() const;
};
因此,vec_int等同於vector<int>,而vector_double等同於vector<double>。因為運用模板類的語法類似於
vector<T> a;
因此,編譯器沒辦法為我們推導T的具體含義,所以不能像模板函數一樣進行簡寫。
當然,上面是比較簡單的情況,有時候我們需要的類在大多數情況下是一樣的,但是對於某幾個特殊情形可能不太一樣,例如我們可能希望對於bool類型的數組能盡量減少內存的使用,用一個比特位代表一個bool值。從而,我們的數組不是通過bool a[10]的形式來定義。在這種情況下,c++提供了模板特化,也就是說當模板的參數取某個具體的值時,我們使用不同的模板,定義方式如下:
template<>
class vector<bool>{
size_t size() const;
};
因為,它是一個特化的模板類,所以只有普通模板存在的情況下,它的存在才是合法的,不然我們是對什麼進行特化的呢?

㈣ c++類模板是怎麼理解

模板類英文為class template,template的中文翻譯為模板,所以模板類的意思其實是:類的模板。
顧名思義,模板類是相當於一個模具,當參數給定時,生成具體的類,也叫實例化。它的提出主要是為了減少代碼重復。
例如,我們可以用下面的代碼交換兩個數b和c
a = b;
b = c;
c = a;
這個交換過程與a,b,c的具體類型沒有關系,因此我們可以用它來交換兩個整數,或者兩個浮點數。更一般的,我們可以用來交換兩個具有賦值運算符的類型。因此,可以用模板進行一般化:
template<class T>
void swap(T &b, T &c){
a = b;
b = c;
c = a;

}
當然,上面介紹的這個不是模板類,而是模板函數。不過他們的概念是類似的。其中一開始的template代表後面尖括弧中的是模板參數(類似於函數的參數),class代表參數是類(相應的,可以用template<int N>來聲明整型參數)。後面的代碼和的函數基本沒有區別,只是用T來代替了具體的類型,例如int,double等。根據需要我們可以用swap<int>(b,c)來交換兩個整數,swap<double>(b,c)交換兩個浮點數。由於編譯器可以根據b,c的具體類型推導T的具體含義,因此可以簡寫為swap(b,c)。
回到模板類,假設我們需要一個類型來代表動態數組,且該類型支持size成員函數。如果是整型的類,我們可能會寫
class vector_int{
size_t size() const;

};
如果某一天,我們又需要浮點類型的動態數組,可能又會寫
class vector_double{
size_t size() const;

};
於是就會發現它們的代碼是如此的類似,因此我們希望將它一般化。如同swap函數的做法,我們將它定義為模板類:
template<class T>
class vector{
size_t size() const;
};
因此,vec_int等同於vector<int>,而vector_double等同於vector<double>。因為運用模板類的語法類似於
vector<T> a;
因此,編譯器沒辦法為我們推導T的具體含義,所以不能像模板函數一樣進行簡寫。
當然,上面是比較簡單的情況,有時候我們需要的類在大多數情況下是一樣的,但是對於某幾個特殊情形可能不太一樣,例如我們可能希望對於bool類型的數組能盡量減少內存的使用,用一個比特位代表一個bool值。從而,我們的數組不是通過bool a[10]的形式來定義。在這種情況下,c++提供了模板特化,也就是說當模板的參數取某個具體的值時,我們使用不同的模板,定義方式如下:
template<>
class vector<bool>{
size_t size() const;
};

㈤ C中實現模板

可以用模板實現。不能因為不知道就說不能實現,C無所不能。

具體實現給樓主發到站內信了。
有問題站內聯系

㈥ c語言實現模板

只有想不到,沒有做不到,等待解答

㈦ 什麼是C語言設計模板結構

應該不是C吧,只有C++才支持模板,題目的意思就是要你用模板類來設計這個管理系統。
比如你的程序可能會用到鏈表存儲結構,這個鏈表類就可以是一個模板類,代入學生類這個類型,就成了具體的用於存儲學生信息的鏈表類了。

㈧ C語言模板函數與自定義函數的區別及優缺點

C語言中有模板函數嗎? 模板不是c++中才提供的特性的嘛,大部分函數都是自定義函數。沒有什麼優點或者缺點吧,完全看函數自身的功能

㈨ C中的模板怎樣使用 最好給個例子~

看看這個吧
http://www.njcc.e.cn/njhysite/njhygao_js/xuebao/xuebao0402/zhjm.doc
其他的見

C語言中實現模板函數的方法

在C語言中實現模板函數的方法:

各種用C語言實現的模板可能在使用形式上有所不同。

現以一個求和函數Sum為例,用C++Template可寫如下:

template<classT,classR> RSum(constT*array,intn)

{

Rsum=0;

for(inti=0;i<n;++i)

sum+=i;

returnsum;

}

如果不是內置類型,該模板隱式地需要有RR::operator+=(T)運算符可用。

1. 使用函數指針作為Functor替換者
TypedefstructtagAddClass

{

Void(*add)(char*r1,constchar*r2);

IntelemSize;

Char sum[MAX_ELEM_SIZE];

}AddClass;

voidSum(AddClass*self,constchar*array,intn)

{

for(inti=0;i<n;++i)

self->add(self->sum,array+i*self->elemSize);

}

使用時:

…..

VoidAddInt(char*r1,constchar*r2)

{

*(long*)r1+=*(int*)r2;

}

AddClassaddClass={AddInt,2,0};

Intarray[100];

Read(array);

Sum(&addClass,array,100);

…..

2. 用宏作為Functor的替換者
#define GenSumFun(SumFunName,Add,RetType,ElemType) \

RetTypeSumFunName(constElemType*array,intn) \

{ \

RetTypesum=0; \

for(inti=0;i<n;++i) \

Add(sum,i); \

returnsum; \

}

使用時:

#defineAddInt(x,y) ((x)+=(y))

GenSumFun(SumInt,AddInt,long,int)

…..

Intarray[100];

Read(array);

Longsum=SumInt(array,100);

…..

3. 所有可替換參數均為宏
至少需要一個額外的文件(實現文件)為impsum.c

/*impsum.c*/

RetTypeFunName(constElemType*array,intn)

{

RetTypesum=0;

for(inti=0;i<n;++i)

Add(sum,i);

returnsum;

}

使用時:

#undef RetType

#undef FunName

#undef ElemType

#undef Add

#defineAddInt(x,y) ((x)+=(y))

#defineRetTypelong

#defineFunNameSumInt

#defineElemTypeint

#defineAdd AddInt

#includeimpsum.c

…..

Intarray[100];

Read(array);

Longsum=SumInt(array,100);

…..

4. 總結:
第一種方法,易於跟蹤調試,但是效率低下,適用於對可變函數(函數指針)的效率要求不高,但程序出錯的可能性較大(復雜),模板函數(Sum)本身很復雜,模板參數也比較復雜(add)的場合。

第二種方法,效率高,但很難跟蹤調試,在模板函數和模板參數本身都很復雜的時候更是如此。

第三種方法,是我最近幾天才想出的,我認為是最好的,在模板參數(Add)比較復雜時可以用函數(第二種也可以如此),簡單時可以用宏,並且,易於調試。在模板函數本身很復雜,而模板參數比較簡單時更為優越。但是,可能有點繁瑣。

一般情況下,沒有必要做如此勞心的工作,一切交給編譯器去做就行了。但是本人在開發一個文件系統時,由於是基於一種少見的平台,沒有可用的C++編譯器,有幾個函數,除了其中的類型不同(uint16和uint32),和幾個可參數化的宏不同,其它地方完全相同,而函數本身很復雜(兩百多行代碼)。Copy出幾個完全類似的函數副本,維護起來特別煩人。非常需要如此的編程模式,故此,分享出來,大家共同探討。

熱點內容
塗鴉論文 發布:2021-03-31 13:04:48 瀏覽:698
手機資料庫應用 發布:2021-03-31 13:04:28 瀏覽:353
版面217 發布:2021-03-31 13:04:18 瀏覽:587
知網不查的資源 發布:2021-03-31 13:03:43 瀏覽:713
基金贖回參考 發布:2021-03-31 13:02:08 瀏覽:489
懸疑故事範文 發布:2021-03-31 13:02:07 瀏覽:87
做簡單的自我介紹範文 發布:2021-03-31 13:01:48 瀏覽:537
戰略地圖參考 發布:2021-03-31 13:01:09 瀏覽:463
收支模板 發布:2021-03-31 13:00:43 瀏覽:17
電氣學術會議 發布:2021-03-31 13:00:32 瀏覽:731