【问题标题】:Syntax of C++ Template Template ParametersC++ 模板模板参数的语法
【发布时间】:2011-09-02 11:48:55
【问题描述】:

我很难理解 C++ 模板模板参数的语法。我理解它们为什么有用,根据出色的描述 here,我只是发现它们的语法很难理解。取自上述网站的两个例子(还有其他):

template <typename T, template <typename> class Cont>
class Stack;

template <template <typename,typename> class Cont>
class Wrapper3;

如果不了解此语法背后的基本原理,就不可能清楚地概括此类声明。记忆更难,似乎没有太大帮助。

编辑: 我意识到我对一个问题的尝试就像一次观察。我要的是帮助如何解释日常用语中的模板模板参数语法。我可以使用 C++ 语法和我学过的所有其他编程语言来做到这一点。但是,我很难向自己“解释”C++ 模板模板参数的语法。我有一本 David Vandevoorde 和 Nicolai M. Josuttis 合着的“C++ 模板:完整指南”,虽然它是一本不错的书,但它对我理解这种语法并没有多大帮助,我敢肯定很多人都会同意这是最古怪的。

【问题讨论】:

  • 你的问题到底是什么?
  • 我觉得他不理解这两个模板类的区别
  • 我知道两者都是两个不同的模板类。我遇到的问题是模板模板参数的语法。
  • @Kerrek:对此感到抱歉:/!但是,通过一些修改,这个问题可能很容易重新打开。
  • @Luc 我试图澄清我的问题。请重新考虑重新提出我的问题。谢谢。

标签: c++ templates syntax


【解决方案1】:

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

template <typename T, template <typename> class Cont>
class Stack;

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

template <template <typename,typename> class Cont>
class Wrapper3;

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

定义模板模板参数的语法与定义类模板(template &lt;typename [param1], typename [param2], ...&gt; 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 {};

虽然不经常发生...

【讨论】:

  • “[模板模板] 参数未命名,因为它没有多大意义(该参数永远不会绑定到任何东西)”。这是否意味着不允许使用template &lt;template &lt;typename E&gt; class C&gt; class Foo { C&lt;E&gt; myField; }
  • @mucaho 您可以为参数命名,但不能使用它,因为它永远不会绑定到任何类型。例如,假设您有类template &lt;typename T&gt; class Bar {}:您可以使用它来实例化Foo,如下所示:Foo&lt;Bar&gt; f。在这种情况下,E 代表的类型是什么?如果你想写Foo&lt;Bar&lt;int&gt;&gt;,那么你不需要模板模板参数,只需要一个常规的非模板参数。
【解决方案2】:

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

template <typename> class Cont

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

template <typename T>
class A {
public:
  A(T t) : t_(t) {}
  T get() { return t_; }
private:
  T t_;
};

你会使用你原来的模板作为

Stack<int, A> s;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    相关资源
    最近更新 更多