如果我需要foo
使用模板模板参数定义模板函数,我通常会执行以下操作:
// Notice that the template parameter of class T is unnamed.
template <template <typename> class T> void f() { std::cout << "Yay!\n"; }
注意 template-template 参数的模板参数是未命名的,但我们可以为这个参数指定一个名称:
// Now the template parameter of class T is named INNER.
template <template <typename INNER> class T> void f(const INNER &inner)
{ std::cout << inner << " Yay!\n"; }
这似乎根本没有用,因为我无法INNER
在函数中引用参数,上面的代码会产生以下错误:
错误:'INNER' 没有命名类型
令我惊讶的是,typename INNER
它没有命名类型,毕竟typename
关键字是为了命名类型。无论如何,这很容易解决:
// Now INNER is the name of the template parameter of class T and also
// the name of the second template parameter of foo.
template <template <typename INNER> class T, typename INNER> void f(const INNER &inner)
{ std::cout << inner << " Yay!\n"; }
// ...
f<std::valarray, int>(666); // Prints "666 Yay!"
但最后,INNER
参数毕竟不需要名称:
// Now the template parameter of class T is unnamed one more time,
// INNER is the name of the second template parameter of foo.
template <template <typename> class T, typename INNER> void f(const INNER &inner)
{ std::cout << inner << " Yay!\n"; }
// ...
f<std::valarray, int>(666); // Prints "666 Yay!"
并且(确保您在我之前已经注意到)模板模板参数的参数中的名称被忽略!它肯定被忽略了,因为如果不是,它应该与第二个模板参数的名称冲突foo
,不是吗?
另一个模板模板参数的名称被忽略的演示:
// Now T is the name of the template parameter of class T and also
// the name of the template parameter of foo!
template <template <typename T> class T> void f()
{ std::cout << "Yay!\n"; }
// ...
f<std::valarray>(); // prints "Yay!"
T
模板模板参数和模板模板本身同时使用命名的类型?我不这么认为,模板模板参数中的名称被忽略了AFAIK。
那么,问题是什么?
- 我的猜测正确吗?模板模板参数的命名模板参数的名称被忽略?
- 如果我弄错了并且我误解了整个事情,那么命名参数是否可以用于模板模板参数?你能提供一些有用的例子吗?
至于#2 上的有用示例,我指的是只能使用模板模板参数的命名模板参数来实现的东西。