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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

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

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

非類型模板參數(參考《C++ Templates 英文版第二版》)

Chapter 3

3.1 非類型類模板參數

與前幾章的簡單例子不同,你也可以通過std::array實例化一個固定大小的棧,這樣做的優點在于內存管理,

#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 }

運行一下:

#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(); }

你也可以設置默認參數

template<typename T, std::size_t Maxsize = 100>,但最好不要這樣做,因為棧大小最好還是有程序員自己控制

3.2 非類型函數模板參數

你也可以為函數定義非類型模板參數

template<int val,typename T> int addval(T a) {return a + val; } int main() {std::cout << addval<10>(10) << std::endl; }

這種函數是很有用的,可以將它作為參數.

例如,如果你可以使用STL,你可以傳入一個函數模板的實例,使集合中的每個數加一個值

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;}

如果你制定非類型函數模板參數是int那么就無法使用其他類型,是有什么方法可以做到自動推導其他類型呢?

其實,你可以指定一個根據之前的模板參數推斷出來的模板參數

template<auto val,typename T = decltype(val)> T addval(T a) {return a + val; }

3.3 非類型模板參數的限制

非類型模板參數有一些限制,例如,它們只能是整數,(對象,函數,成員)指針,(對象,函數,成員)引用,std::nullptr

浮點數指針和類對象不可以作為非類型模板參數

3.4 模板參數類型auto

C++17 ,你可以定義一個非類型模板模板參數去普遍的接收任何類型,使用這個特性,你可以定義一個更加一般的固定大小棧

#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 }

運行:

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';}

總結

以上是生活随笔為你收集整理的非类型模板参数(参考《C++ Templates 英文版第二版》)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。