c++中有乙個重要特性,那就是模板型別。類似於objective-c中的泛型。c++通過類模板來實現泛型支援。
類模板,可以定義相同的操作,擁有不同資料型別的成員屬性。通常使用template來宣告。告訴編譯器,碰到t不要報錯,表示一種泛型.如下,宣告乙個普通的類模板:
templatevoid
foo(t a, t b)
宣告乙個模板類
template classcomplex
//運算子過載
complexoperator+(complex &c)
private
: t a;
t b;
}int
main()
在模板類的繼承中,需要注意以下幾點:
template classparent
private
: t p;
};//
如果子類不是模板類,需要指明父類的具體型別
class childone:public parent
private
:
intcone;
};//
如果子類是模板類,可以用子類的泛型來表示父類
template class childtwo:public parent
private
: t ctwo;
};
變長模板、變長引數是依靠c++11新引入的引數包的機制實現的。
具體的實現方法為:
template
可通過sizeof...(args)統計引數包所含元素的個數。
對引數包進行處理有遞迴方式和非遞迴方式。
1 遞迴處理引數包
//通過遞迴函式展開引數包,需要提供乙個引數包展開的函式和乙個遞迴終止函式。
//遞迴終止函式 (必須宣告在展開函式之前 )
void
debug()
//展開函式
template
void
debug(t first, args ... last)
應當注意:遞迴終止條件的函式過載,必須放在展開函式之前。
參考:1.
2.3.
可變長函式引數模板
include 通用可變引數模板 處理不限定個數的引數,處理不同型別 void showall 空函式,介面,最後結束遞迴 新版本編譯 強制預留介面 template 可變長度!void showall const t value,const args args 設計可以修改原來的資料的 t val...
c 11變長引數函式模板
by francis hao mar 25,2018 乙個最簡單的例項大概是這個樣子 include usingnamespacestd 變長引數函式模板宣告 template typename.t voidprint t.val 邊界條件 voidprint void 遞迴的特例化定義 templ...
變長引數模版函式初探
最開始在寫乙個 命令模組,涉及到 簡單命令 和 復合命令。所有的命令 是通過字串組裝的。命令的呼叫是通過註冊機制 實現繫結的。具體的功能封裝在對應的 功能類裡面。由於復合命令的存在,會導致一條命令 執行多個處理。所以希望在 註冊的時候,能夠直接將多個物件直接儲存到乙個容器內。這就會涉及到 不定長引數...