日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

非类型模板参数

發(fā)布時間:2023/12/4 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 非类型模板参数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

對于函數(shù)模板與類模板,模板參數(shù)并不局限于類型,普通值也可以作為模板參數(shù)。在基于類型參數(shù)的模板中,你定義了一些具體的細節(jié)來加以確定代碼,直到代碼被調(diào)用時這些細節(jié)才被真正的確定。但是在這里,我們面對的是這些細節(jié)是值,而不是類型,當(dāng)要使用基于值的模板時,必須顯式地指定這些值,才能夠?qū)δ0暹M行實例化。

非類型的類模板參數(shù)

?

創(chuàng)建類的頭文件

#include<stdexcept> #include<iostream> using namespace std;template<typename T, int MAXSIZE> class Stack{ private:T elems[MAXSIZE];int numElems; public:Stack();void push(T const&);void pop();T top() const;bool empty() const {return numElems == 0;}bool full() const {return numElems == MAXSIZE;} };template<typename T, int MAXSIZE> Stack<T, MAXSIZE>::Stack():numElems(0) {}template<typename T, int MAXSIZE> void Stack<T, MAXSIZE>::push(T const& elem) {if(numElems == MAXSIZE) {throw out_of_range("Stack<>::push(): stack is full");}elems[numElems] = elem;++numElems; }template<typename T, int MAXSIZE> void Stack<T, MAXSIZE>::pop() {if(numElems <= 0) {throw out_of_range("Stack<>::pop(): stack is full");}--numElems; }template<typename T, int MAXSIZE> T Stack<T, MAXSIZE>::top() const {if(numElems <= 0) {throw out_of_range("Stack<>::top(): stack is full");}return elems[numElems - 1]; }
#include<stdexcept> #include<iostream> using namespace std;template<typename T, int MAXSIZE> class Stack{ private:T elems[MAXSIZE];int numElems; public:Stack();void push(T const&);void pop();T top() const;bool empty() const {return numElems == 0;}bool full() const {return numElems == MAXSIZE;} };template<typename T, int MAXSIZE> Stack<T, MAXSIZE>::Stack():numElems(0) {}template<typename T, int MAXSIZE> void Stack<T, MAXSIZE>::push(T const& elem) {if(numElems == MAXSIZE) {throw out_of_range("Stack<>::push(): stack is full");}elems[numElems] = elem;++numElems; }template<typename T, int MAXSIZE> void Stack<T, MAXSIZE>::pop() {if(numElems <= 0) {throw out_of_range("Stack<>::pop(): stack is full");}--numElems; }template<typename T, int MAXSIZE> T Stack<T, MAXSIZE>::top() const {if(numElems <= 0) {throw out_of_range("Stack<>::top(): stack is full");}return elems[numElems - 1]; }

實現(xiàn)代碼:

#include<iostream> #include<vector> #include<deque> #include<stdexcept> #include<string> #include<cstdlib> #include "stack4.h" using namespace std;int main() {try {Stack<int, 20> int20Stack;Stack<int, 40> int40Stack;Stack<string, 40> stringStack;int20Stack.push(7);cout<<int20Stack.top()<<endl;int20Stack.pop();stringStack.push("hello");cout<<stringStack.top()<<endl;stringStack.pop();stringStack.pop();}catch(exception const& ex) {cerr<<"Exception: "<<ex.what()<<endl;//return EXIT_FAILURE;}cin.get(); return 0; }
#include<iostream> #include<vector> #include<deque> #include<stdexcept> #include<string> #include<cstdlib> #include "stack4.h" using namespace std;int main() {try {Stack<int, 20> int20Stack;Stack<int, 40> int40Stack;Stack<string, 40> stringStack;int20Stack.push(7);cout<<int20Stack.top()<<endl;int20Stack.pop();stringStack.push("hello");cout<<stringStack.top()<<endl;stringStack.pop();stringStack.pop();}catch(exception const& ex) {cerr<<"Exception: "<<ex.what()<<endl;//return EXIT_FAILURE;}cin.get(); return 0; }

MAXSIZE是新加入的第二個模板參數(shù),類型為int,它指定了數(shù)組最多可包含的棧元素的個數(shù)
同樣,我們可以為模板參數(shù)指定缺省值:

template<typename T = int, int MAXSIZE = 100> class Stack {... };

  非類型的函數(shù)模板參數(shù)

你也可以為函數(shù)模板定義非類型參數(shù)。例如:

template<typename T, int VAL> T addValue(T const& x) {return x + VAL: }

借助于STL,可以傳遞這個函數(shù)模板的實例化給集中的每一個元素,讓他們都增加一個整數(shù)值:

std::transform(source.begin(), source.end(), dest.begin(), (int(*)(int const&))addValue<int, 5>);

  非類型模板參數(shù)的限制

非類型模板參數(shù)是有限制的,通常而言,它們可以是常整數(shù)(包括枚舉值)或者指向外部鏈接對象的指針。

浮點數(shù)和類對象是不允許作為非類型模板參數(shù)的:

template<double VAT> double process(double v) //error {return V * VAT; }template<string name> //error class MyClass {... };

??另外,你也不能使用全局指針作為模板參數(shù)

template<char const* name> class MyClass{... };char const* s = "hello"; MyClass<s> x; //s是一個指向內(nèi)部連接對象的指針

但是你可以這樣使用:

template<char const* name> class MyClass {... };extern char const s[] = "hello"; MyClass<s> x; //OK

全局字符數(shù)組s由"hello"初始化,是一個外部鏈接對象

總結(jié)

以上是生活随笔為你收集整理的非类型模板参数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。