乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       頭號(hào)碼甲 2021-06-25

      概念

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

      舉例

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

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

      使用:

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

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

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

      template <typename T, template <typename Elem> class Cont = std::deque>
      class Stack {
      private:
        Cont<T> elems; // elements
      public:
        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ū)別是:第二個(gè)模板參數(shù)是一個(gè)類模板:

      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> // OK
      void f(C<int>* p);
      
      template<template<typename X> struct C> // ERROR: struct not valid here
      void f(C<int>* p);
      
      template<template<typename X> union C> // ERROR: union not valid here
      void 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)饒,舉個(gè)例子:

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

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

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

      error: template template argument has different template parameters than its corresponding template template parameter
      template <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 argument
      template <class _Tp, class _Allocator /*= allocator<_Tp>*/>

      意思是std::dequeCont不匹配。標(biāo)準(zhǔn)庫的std::deque有兩個(gè)參數(shù),還有一個(gè)默認(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í)(四)—— 可變參數(shù)模板 Variadic Template

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

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

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

      假如使用 Stack<int,std::array> s;,那么編譯器會(huì)報(bào)錯(cuò):

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

      (完)

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多