对于函数模板和类模板,模板参数并不局限于类型,普通值也可以作为模板参数。但非类型模板参数是有限制的,只能是常整数(包括枚举值)或者指向外部链接对象的指针,浮点数、类对象和内部链接对象不允许作为非类型模板参数的。
1、非类型类模板参数例子
#include<iostream> using namespace std; //Maxsize是一个非类型模板参数 template<typename T, int Maxsize> class Stack{ private: T elems[Maxsize];//包含元素的数组 int numOfElems;//当前元素个数 public: Stack(); void push(T const& elem); void pop(); T top() const; bool empty() const{ return numOfElems == 0; } }; template<typename T, int Maxsize> Stack<T, Maxsize>::Stack() :numOfElems(0){} template<typename T, int Maxsize> void Stack<T, Maxsize>::push(T const& elem){ elems[numOfElems] = elem; ++numOfElems; } template<typename T, int Maxsize> void Stack<T, Maxsize>::pop(){ if (numOfElems<=0){ throw out_of_range("Stack<>::pop():empty stack"); } --numOfElems; } template<typename T, int Maxsize> T Stack<T, Maxsize>::top() const{ if (numOfElems==0){ throw out_of_range("Stack<>::pop():empty stack"); } return elems[numOfElems-1]; } int main(){ try{ Stack<int,20> istk; istk.push(7); istk.push(8); istk.push(9); cout << istk.top() << endl; istk.pop(); cout << istk.top() << endl; }catch (exception const& ex){ cerr << "Exception:" << ex.what() << endl; return EXIT_FAILURE; } system("pause"); return 0; }
2、非类型函数模板参数例子
#include<iostream> #include<algorithm> #include<vector> using namespace std; template<typename T=int,int Val> T addValue(T const& x){ return x + Val; } int main(){ vector<int> vec{ 1, 2, 3, 4, 5, 6, 7, 8 }; transform(vec.begin(), vec.end(), vec.begin(), (int(*)(int const&))addValue<int, 5>); for (auto const& c : vec) cout << c << " ";//6 7 8 9 10 11 12 13 cout << endl; system("pause"); return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。