c++模板语法模板参数

Syntax of C++ Template Template Parameters

本文关键字:参数 语法 c++      更新时间:2023-10-16

我很难理解c++模板模板参数的语法。我理解它们为什么有用,就像这里优秀的描述一样,我只是发现它们的语法很难理解。上面网站上的两个例子(还有其他的):

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

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

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

编辑:我意识到我试图提出的问题给人留下了一种观察的印象。我要求的是如何在日常说话中解释模板模板参数语法的帮助。我可以用c++语法和我学过的所有其他编程语言来做到这一点。然而,我很难"解释"c++模板模板参数的语法给自己。我有一本书,《c++模板:完整指南》,作者是David Vandevoorde和Nicolai M. Josuttis,虽然这是一本好书,但它对我理解这种语法没有多大帮助,我相信很多人会同意这种语法最多是古怪的。

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

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

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

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

Wrapper3是一个类模板,只有一个参数ContCont必须是有两个形参的类模板

定义模板模板参数的语法与定义类模板(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 {};

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

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;