ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 命名参数是否用于模板模板参数

2019-09-29 05:16:11  阅读:152  来源: 互联网

标签:template-templates c templates


如果我需要使用template-template参数定义模板foo函数,我通常会执行以下操作:

// Notice that the template parameter of class T is unnamed.
template <template <typename> class T> void f() { std::cout << "Yay!\n"; }

请注意,template-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参数,上面的代码会产生以下错误:

error: ‘INNER’ does not name a type

令我惊讶的是,在命名一个类型之后,所有typename关键字出现后,类型名称INNER没有命名类型.无论如何,这很容易修复:

// 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的类型是由template-template参数和模板模板本身同时使用的?我不这么认为,模板模板参数的名称被忽略了AFAIK.

那么,问题是什么?

>我的猜测是否正确?模板模板参数的命名模板参数名称是否被忽略?
>如果我弄错了并且我误解了整个事情,那么将命名参数用于模板模板参数?你能提供一些有用的例子吗?

关于#2的有用示例,我指的是只能使用模板模板参数的命名模板参数来实现的东西.

解决方法:

[basic.scope.temp] / P1:

The declarative region of the name of a template parameter of a
template template-parameter is the smallest template-parameter-list
in which the name was introduced.

(现在尝试说10次.)

它可以在该列表中使用.例如,

template < template<class T, T t> class TP > class foo {};
//                           ^  ^-----T's scope ends here
//                           |
//                           T can be used here

foo<std::integral_constant> bar;

标签:template-templates,c,templates
来源: https://codeday.me/bug/20190929/1830634.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有