C++模板模板参数的语法

Olu*_*ide 6 c++ syntax templates

我很难理解C++模板模板参数的语法.我理解它们为什么有用,根据这里的优秀描述,我发现它们的语法难以理解.以上网站的两个例子(还有其他):

template <typename T, template <typename> class Cont>
class Stack;
Run Code Online (Sandbox Code Playgroud)

template <template <typename,typename> class Cont>
class Wrapper3;
Run Code Online (Sandbox Code Playgroud)

如果不理解这种语法背后的基本原理,那么明确地概括这些声明是不可能的.记忆更难,似乎没有多大帮助.

编辑:我意识到我对某个问题的尝试就像观察一样.我要求的是如何在日常用语中解释模板模板参数语法.我可以用C++语法和我学到的所有其他编程语言来做到这一点.但是我很难向自己"解释"C++模板模板参数的语法.我收到了一本书,"C++模板:David Vandevoorde和Nicolai M. Josuttis的完整指南",虽然它是一本很好的书,但对我理解这种语法并没有多大帮助,我确信很多人会同意最好是古怪的.

Luc*_*lle 18

我不确定你的问题到底是什么,但这里是你给出的两个例子的解释.

template <typename T, template <typename> class Cont>
class Stack;
Run Code Online (Sandbox Code Playgroud)

Stack是一个包含两个模板参数的类模板.第一个参数T可以是任何类型(包括内置类型,用户定义类型,模板实例化等).第二个参数Cont必须是带有一个参数的类模板.该参数未命名,因为它没有多大意义(参数永远不会绑定到任何东西).

template <template <typename,typename> class Cont>
class Wrapper3;
Run Code Online (Sandbox Code Playgroud)

Wrapper3是一个带有单个参数的类模板Cont.Cont必须是具有两个参数的类模板.

定义模板模板参数的语法与定义类模板(template <typename [param1], typename [param2], ...> class Name)的语法相同,所以我真的不明白你的问题是什么.

但是,我同意当您开始"嵌套"模板模板参数时,语法会变得有点尴尬:

// class template whose parameter must be a class template whose parameter
// must be a class template
template <template <template <typename> class > class C >
struct Wow {};
Run Code Online (Sandbox Code Playgroud)

尽管经常不会发生......


Nic*_*tti 4

没有什么那么神秘的。只需从原始模板中取出您的模板模板参数即可:

template <typename> class Cont
Run Code Online (Sandbox Code Playgroud)

任何具有单一类型参数的类模板都适合,例如

template <typename T>
class A {
public:
  A(T t) : t_(t) {}
  T get() { return t_; }
private:
  T t_;
};
Run Code Online (Sandbox Code Playgroud)

您将使用原始模板作为

Stack<int, A> s;
Run Code Online (Sandbox Code Playgroud)