非类型模板参数(参考《C++ Templates 英文版第二版》)
非類型模板參數(shù)(參考《C++ Templates 英文版第二版》)
Chapter 3
3.1 非類型類模板參數(shù)
與前幾章的簡(jiǎn)單例子不同,你也可以通過std::array實(shí)例化一個(gè)固定大小的棧,這樣做的優(yōu)點(diǎn)在于內(nèi)存管理,
#include <array> #include <cassert>template<typename T, std::size_t Maxsize> class Stack {private:std::array<T,Maxsize> elems; // elementsstd::size_t numElems; // current number of elementspublic:Stack(); // constructorvoid push(T const& elem); // push elementvoid pop(); // pop elementT const& top() const; // return top elementbool empty() const { // return whether the stack is emptyreturn numElems == 0;}std::size_t size() const { // return current number of elementsreturn numElems;} };template<typename T, std::size_t Maxsize> Stack<T,Maxsize>::Stack (): numElems(0) // start with no elements {// nothing else to do }template<typename T, std::size_t Maxsize> void Stack<T,Maxsize>::push (T const& elem) {assert(numElems < Maxsize);elems[numElems] = elem; // append element++numElems; // increment number of elements }template<typename T, std::size_t Maxsize> void Stack<T,Maxsize>::pop () {assert(!elems.empty());--numElems; // decrement number of elements }template<typename T, std::size_t Maxsize> T const& Stack<T,Maxsize>::top () const {assert(!elems.empty());return elems[numElems-1]; // return last element }運(yùn)行一下:
#include "stacknontype.hpp" #include <iostream> #include <string>int main() {Stack<int, 20> int20Stack; // stack of up to 20 intsStack<int, 40> int40Stack; // stack of up to 40 intsStack<std::string, 40> stringStack; // stack of up to 40 strings// manipulate stack of up to 20 intsint20Stack.push(7);std::cout << int20Stack.top() << '\n';int20Stack.pop();// manipulate stack of up to 40 stringsstringStack.push("hello");std::cout << stringStack.top() << '\n';stringStack.pop(); }你也可以設(shè)置默認(rèn)參數(shù)
template<typename T, std::size_t Maxsize = 100>,但最好不要這樣做,因?yàn)闂4笮∽詈眠€是有程序員自己控制
3.2 非類型函數(shù)模板參數(shù)
你也可以為函數(shù)定義非類型模板參數(shù)
template<int val,typename T> int addval(T a) {return a + val; } int main() {std::cout << addval<10>(10) << std::endl; }這種函數(shù)是很有用的,可以將它作為參數(shù).
例如,如果你可以使用STL,你可以傳入一個(gè)函數(shù)模板的實(shí)例,使集合中的每個(gè)數(shù)加一個(gè)值
std::vector<int> source{ 1,4,5 };std::vector<int> dest{0,0,0};std::transform(source.begin(), source.end(), dest.begin(), addval<10,int>);for (auto value : dest){std::cout << value << std::endl;}如果你制定非類型函數(shù)模板參數(shù)是int那么就無(wú)法使用其他類型,是有什么方法可以做到自動(dòng)推導(dǎo)其他類型呢?
其實(shí),你可以指定一個(gè)根據(jù)之前的模板參數(shù)推斷出來的模板參數(shù)
template<auto val,typename T = decltype(val)> T addval(T a) {return a + val; }3.3 非類型模板參數(shù)的限制
非類型模板參數(shù)有一些限制,例如,它們只能是整數(shù),(對(duì)象,函數(shù),成員)指針,(對(duì)象,函數(shù),成員)引用,std::nullptr
浮點(diǎn)數(shù)指針和類對(duì)象不可以作為非類型模板參數(shù)
3.4 模板參數(shù)類型auto
C++17 ,你可以定義一個(gè)非類型模板模板參數(shù)去普遍的接收任何類型,使用這個(gè)特性,你可以定義一個(gè)更加一般的固定大小棧
#include <array> #include <cassert>template<typename T, auto Maxsize> class Stack {public:using size_type = decltype(Maxsize);private:std::array<T,Maxsize> elems; // elementssize_type numElems; // current number of elementspublic:Stack(); // constructorvoid push(T const& elem); // push elementvoid pop(); // pop element T const& top() const; // return top elementbool empty() const { // return whether the stack is emptyreturn numElems == 0;}size_type size() const { // return current number of elementsreturn numElems;} };// constructor template<typename T, auto Maxsize> Stack<T,Maxsize>::Stack (): numElems(0) // start with no elements {// nothing else to do }template<typename T, auto Maxsize> void Stack<T,Maxsize>::push (T const& elem) {assert(numElems < Maxsize);elems[numElems] = elem; // append element++numElems; // increment number of elements }template<typename T, auto Maxsize> void Stack<T,Maxsize>::pop () {assert(!elems.empty());--numElems; // decrement number of elements }template<typename T, auto Maxsize> T const& Stack<T,Maxsize>::top () const {assert(!elems.empty());return elems[numElems-1]; // return last element }運(yùn)行:
Stack<int, 20u> int20Stack; // stack of up to 20 intsStack<std::string, 40> stringStack; // stack of up to 40 strings// manipulate stack of up to 20 intsint20Stack.push(7);std::cout << int20Stack.top() << '\n';auto size1 = int20Stack.size();// manipulate stack of up to 40 stringsstringStack.push("hello");std::cout << stringStack.top() << '\n';auto size2 = stringStack.size();if (!std::is_same_v<decltype(size1), decltype(size2)>) {std::cout << "size types differ" << '\n';}總結(jié)
以上是生活随笔為你收集整理的非类型模板参数(参考《C++ Templates 英文版第二版》)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 智能计算机翻译,爱译网-智能翻译技术-人
- 下一篇: s3c2440移植MQTT