我正在搜索与模板模板参数有关的其他内容,并发生在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;
这是扩展名,还是其他答案实际上不正确,并且标准允许?如果不是,是否有任何特殊原因导致遗漏?
最佳答案
在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++中没有模板模板之类的东西(有类,函数和别名模板,但是它们总的来说只是"template"),因此就没有模板模板参数之类的东西。您所拥有的是磨机模板模板参数,其中所需的模板参数本身具有模板模板参数。我在标准中找不到禁止这样做的引用,就像您链接的答案所声称的那样。
关于c++ - 模板模板参数是模板的扩展还是标准的一部分?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11338019/