概念一個(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),允許我們?cè)诼暶鱏tack類模板的時(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)值從 在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>*/> 意思是 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)對(duì)于 // template<typename T, size_t N> // class array; 假如使用 /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> ^ (完) |
|
|