我正在搜索与模板模板参数相关的其他内容,并发生在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;
这是一个扩展,还是其他答案实际上是错误的并且标准允许?如果没有,是否有任何特殊原因遗漏?
答案 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 ++中没有模板模板这样的东西(有类,函数和别名模板 - 但它们总是简称'模板'),所以没有模板模板模板参数这样的东西。你所拥有的是一个磨损模板模板参数,其中预期的模板参数本身有一个模板模板参数。我无法在标准中找到禁止此内容的参考,例如您链接声明的答案。