九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
c++11-17 模板核心知識(十二)—— 模板的模板參數(shù) Template Template Parameters

概念

一個模板的參數(shù)是模板類型。

舉例

c++11-17 模板核心知識(二)—— 類模板 中,如果我們想要允許指定存儲Stack元素的容器,是這么做的:

template <typename T, typename Cont = std::vector<T>> class Stack {private:  Cont elems; // elements  ......};

使用:

Stack<double,std::deque<double>> dblStack;

但是這樣的缺點(diǎn)是需要指定元素類型兩次,然而這兩個類型是一樣的。

使用模板的模板參數(shù)(Template Template Parameters),允許我們在聲明Stack類模板的時候只指定容器的類型而不去指定容器中
元素的類型。例如:

template <typename T, template <typename Elem> class Cont = std::deque>class Stack {private:  Cont<T> elems; // elementspublic:  void push(T const &); // push element  void pop();           // pop element  T const &top() const; // return top element  bool empty() const {  // return whether the stack is empty    return elems.empty();  }  ...};

使用:

Stack<int, std::vector> vStack;      // integer stack that uses a vector

與第一種方式的區(qū)別是:第二個模板參數(shù)是一個類模板:

template<typename Elem> class Cont

默認(rèn)值從std::deque<T>改為了std::deque.

在C++17之后,模板的模板參數(shù)中的class也可以使用typename,但是不可以使用struct和union:

template <typename T,          template <typename Elem> typename Cont = std::deque>class Stack {       // ERROR before C++17  ...};......template<template<typename X> class C> // OKvoid f(C<int>* p);template<template<typename X> struct C> // ERROR: struct not valid herevoid f(C<int>* p);template<template<typename X> union C> // ERROR: union not valid herevoid f(C<int>* p);

當(dāng)然,由于模板的模板參數(shù)中的Elem沒有用到,可以省略:

template <typename T, template <typename> class Cont = std::deque> class Stack {  ...};

另外注意一點(diǎn),模板的模板參數(shù)中的模板參數(shù),只能和模板的模板參數(shù)配合用。有點(diǎn)饒,舉個例子:

template<template<typename T, T*> class Buf>        // OKclass Lexer {    static T* storage;        // ERROR: a template template parameter cannot be used here    ...};

模板的模板參數(shù)的參數(shù)匹配 Template Template Argument Matching

大家可以嘗試自己編譯一下上面的代碼,可能會出現(xiàn)下列問題:

error: template template argument has different template parameters than its corresponding template template parametertemplate <typename T, template <typename Elem> class Cont = std::deque>.../Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/deque:1197:1: note: too many template parameters in template template argumenttemplate <class _Tp, class _Allocator /*= allocator<_Tp>*/>

意思是std::dequeCont不匹配。標(biāo)準(zhǔn)庫的std::deque有兩個參數(shù),還有一個默認(rèn)參數(shù)Allocator :

template <class _Tp, class _Allocator = allocator<_Tp> > class _LIBCPP_TEMPLATE_VIS deque;

解決辦法一

將Cont和std::deque的參數(shù)匹配即可:

template <typename T,          template <typename Elem, typename Alloc = std::allocator<Elem>>          class Cont = std::deque>class Stack {......};

這里的Alloc沒有用到,同樣可以省略。

成員函數(shù)定義舉例:

template<typename T, template<typename,typename> class Cont>void Stack<T,Cont>::push (T const& elem) {    elems.push_back(elem);       // append copy of passed elem}

解決辦法二

利用c++11-17 模板核心知識(四)—— 可變參數(shù)模板 Variadic Template

template <typename T,          template <typename......>          class Cont = std::deque>class Stack {......};

但是,這點(diǎn)對于std::array無效,因?yàn)閟td::array的第二個參數(shù)是非類型模板參數(shù) Nontype Template Parameters:

// template<typename T, size_t N>// class array;

假如使用 Stack<int,std::array> s;,那么編譯器會報錯:

/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/array:126:29: note: template parameter has a different kind in template argumenttemplate <class _Tp, size_t _Size>                            ^main.cc:22:33: note: previous template template parameter is here          template <typename... Elem>                                ^

(完)

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
C++模板元編程(C++ template metaprogramming)
typename在C++中的用法
c – Variadic模板和std :: bind
c++11-17 模板核心知識(十四)—— 解析模板之依賴型模板名稱 Dependent Names of Templates(.template/->template/::template)
Vector類模板界面及其函數(shù)的實(shí)現(xiàn)
模板類中定義std::list::iterator iter在Linux下不識別
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服