9

我正在搜索与模板模板参数相关的其他内容,并且在这个答案中发生了,该答案声称标准不允许模板模板参数

但是,以下代码在最新的 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;

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

4

1 回答 1

8

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

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

由于在 C++ 中没有模板模板之类的东西(有类、函数和别名模板——但它们统称为简单的“模板”),因此没有模板模板模板参数之类的东西。你所拥有的是一个运行模板模板参数,其中预期的模板参数本身具有一个模板模板参数。我在标准中找不到禁止这样做的参考,例如您链接声明的答案。

于 2012-07-05T05:33:01.607 回答