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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

非类型模板参数(参考《C++ Templates 英文版第二版》)

發(fā)布時(shí)間:2023/12/10 c/c++ 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 非类型模板参数(参考《C++ Templates 英文版第二版》) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

非類型模板參數(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)容,希望文章能夠幫你解決所遇到的問題。

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