C 模板 之 型別萃取 與 容器介面卡

2021-07-24 00:22:46 字數 3432 閱讀 3837

型別萃取 在模板這裡主要就是對於模板的不同型別的例項化 有不同的方案 這樣可以提高效率等 

比如 下面的 順序表 在擴容時的拷貝 

對於沒有含有指向空間的指標的類 如int 自動使用memcpy()

對於含有指向空間的指標的類 如string 就自動乙個乙個的賦值 防止淺拷貝導致兩個指標指向同一空間 析構兩次時出錯

型別萃取實現 主要用到了

模板模板特化 內嵌型別  也可用函式過載 詳見copy()

//(1)-------型別萃取 實現順序表

#ifndef __copy_h__

#include

#include

using namespace std;

struct truetype //內建型別

struct falsetype //非內建型別

template//_tp 型別 預設(沒特化)使用 迴圈 乙個乙個賦值 

struct typetraits

/內嵌型別

// 特化:實現同乙個型別ispodtype對於不同的特化表示的型別不同 如 falsetype/truetype

// 使用 memcpy 的型別 用struct typetraits<...>;

template<>

struct typetraits

template<>

struct typetraits

template<>

struct typetraits

template<>

struct typetraits

//還有未特化的 這裡只是舉幾個例子 實際中應盡可能寫完整......

// 使用 迴圈 乙個乙個賦值的型別 使用struct typetraits<...>;

template<>

struct typetraits

typedef falsetype ispodtype;

//**********==== 函式過載 的 應用 【copy第一種方式的實現原理】**********====

int m_copy(int a, int b, int)

int m_copy(int a, int b, float)

#if 0 //*************************=

//**********== 1 萃取  copy的第1種方法 **********====

// 利用 函式過載來區分 falsetype  truetype

template

void copy(t* dst, const t* src, int size, falsetype)

template

void copy(t* dst, const t* src, int size, truetype)

void test2()

#endif //*************************=

//**********== 1 萃取  copy的第2種方法 **********====

//               用模板函式

template

void copy(t* dst, const t* src, size_t size)

ispodtype()

#endif

//---------------   seq_list_by_cuiqu.cpp--------

#define _crt_secure_no_warnings 1

#include "copy.h"

template

class seqlist

public:

private:

// 更高效 使用【型別萃取】 對於可以使用memcpy的型別使用memcpy

// 對於不可以使用memcpy的 使用 迴圈乙個乙個賦值 增強效率

// 因為memcpy效率比較高

copy(tmp, _data, _size);

private:

//***************==注意2 預設拷貝函式出現淺拷貝問題 **********=

//這要寫 拷貝構造 防止出現淺拷貝問題

// 例如對於string這種含有指向動態開闢空間 的 指標成員

template

seqlist::seqlist(const seqlist& s)

template

seqlist::seqlist()

template

seqlist::~seqlist()

template

void seqlist::pushback(const t& d)

template

void seqlist::popback()

template

void seqlist::pushfront(const t& d)

template

void seqlist::popfront()

template

seqlist& seqlist::operator=(const seqlist& s)//注意用seqlist&

template

int seqlist::find(const t& d)

template

void seqlist::reverse()

template

void seqlist::insert(int pos, const t& d)

template

void seqlist::sort()

int main()

seqlist s3;

s3.print();

//(2) 容器介面卡

容器介面卡 允許 模板引數 是模板類的類型別

// container 介面卡練習

//template

//模板的模板引數

template class container = seqlist>

class stack

public:

private:

containercon;

int main()

#endif

//#include

//int main()

//#include

//int main()

//小知識點

//*****===隱式轉換

class d

public:

explicit d(int d)

:_d(d)

{cout<<"d()"int _d;

int main()

d d = 1; //防止使用d(int d)建構函式 隱式轉換 可以使用關鍵字explicit 阻止隱式轉換

getchar();

本文出自 「城市獵人」 部落格,請務必保留此出處

C 容器介面卡

1 什麼是介面卡 2 容器介面卡 3 為什麼將stack queue和priority queue稱作為容器介面卡 雖然stack queue priority queue中也可以存放元素,但在stl中並沒有將其劃分在容器的行列,而是將其稱為容器介面卡,這是因為每個容器在底層都有自己的實現方式,而s...

C 容器介面卡

除了順序容器外,標準庫還定義了三個順序容器介面卡 stack,queue和priority queue。介面卡是一種機制,能夠使某種事物行為看起來像另外一種事物。乙個容器介面卡接受一種已有的容器型別,使其行為看起來像一種不同的型別。所有容器介面卡都支援的操作和型別 操作和型別 說明size type...

C 容器介面卡

除去順序容器vector 向量,可變大小陣列 deque 雙端佇列 list 雙向鍊錶 forward list 單向鍊錶 array 固定陣列大小,array的大小不可變 外,標準庫還定義了三個順序容器介面卡 stack queue priority queue 介面卡是標準庫中乙個通用的概念,包...