模板模板模板参数是扩展还是标准的一部分?

时间:2012-07-05 04:55:24

标签: c++ templates template-templates

我正在搜索与模板模板参数相关的其他内容,并发生在this answer上,声称标准模板模板参数

但是,以下代码在最新的clang(3.2)和最新的GCC(4.8)中编译:

template<template<template<typename> class> class T> struct test {};
template<template<typename> class T> struct foo {};
test<foo> bar;

这是一个扩展,还是其他答案实际上是错误的并且标准允许?如果没有,是否有任何特殊原因遗漏?

1 个答案:

答案 0 :(得分:8)

std::vector<int>中,类模板std::vector作为参数传递类型int。在std::get<42>(some_tuple)中,函数模板std::get作为参数传递值42。也许缺乏想象力,前一种参数被称为模板(或模板类型参数)的类型参数,而后一种类型是(模板)非类型参数。

但模板也可以接受另一种参数:其他模板。例如,template<template<typename> class T> void foo();声明一个以模板为参数的函数模板,它本身采用一个类型参数。 (注意,虽然模板不是类型,但术语'非类型参数'仍然不包括模板模板参数。它保留用于template<int NonTypeArgument>之类的参数。)

由于C ++中没有模板模板这样的东西(有类,函数和别名模板 - 但它们总是简称'模板'),所以没有模板模板模板参数这样的东西。你所拥有的是一个磨损模板模板参数,其中预期的模板参数本身有一个模板模板参数。我无法在标准中找到禁止此内容的参考,例如您链接声明的答案。