首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么标准不允许初始化模板参数列表中的常量依赖类型?

为什么标准不允许初始化模板参数列表中的常量依赖类型?
EN

Stack Overflow用户
提问于 2015-08-19 12:17:44
回答 1查看 1.5K关注 0票数 35

在对这篇文章"(部分)专门化依赖类型的非类型模板参数。“的答复中,它指出:

与专用的非类型参数相对应的模板参数的类型不应依赖于专门化的参数。[例子: 模板<类T,T t>结构C {};模板结构C;// template< int X,int (*array_ptr)X >类A {};int array5;template< int X>类A { };//错误 -end示例]

我的问题是为什么这里有这个限制?至少有一个用例,我发现这个限制会干扰编写干净的代码。例如。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <typename T, T*>
struct test;

template <typename T>
struct test<T, nullptr> // or struct test<T, (T*)nullptr>
{
};

template <typename R, typename...ARGs, R(*fn)(ARGs...)>
struct test<R(ARGs...), fn>
{
};

虽然我不确定是否还有其他的情况,基于类型的常量声明是一个问题,除了没有任何意义。

有人有理由这么做吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-06 10:05:23

(IMHO)标准不允许某一特定功能的最常见的原因是:

  1. 该特性被语言中的另一种机制所覆盖,因此它是多余的。
  2. 它与现有的语言逻辑和实现相矛盾,使其实现有可能中断代码。
  3. 遗留:这个特性一开始就被忽略了,现在我们已经构建了很多没有它的特性,以至于它几乎被遗忘了(请参阅部分函数模板专门化)。

实现的困难很少是一个因素,尽管编译器实现可能需要一些时间才能赶上“困难”方面的发展。

您可以始终将非类型模板参数包装为另一种类型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template < typename T1, typename T2 > 
struct Demo {}; // primary template

template < typename T > 
struct Demo<T, integral_constant<T, 0>> {}; // specialization

我怀疑这个黑客属于案例1。案例3总是有可能的,所以让我们检查一下案例2。要做到这一点,我们必须知道标准对类模板部分专门化所规定的相关规则。

14.5.5 类模板部分专门化

  1. 如果非类型参数是非类型参数的名称,则非类型参数是非专用的.所有其他非类型参数都是专门化的。(C1)
  2. 在类模板部分专门化的参数列表中,适用以下限制:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- A partially specialized non-type argument expression shall not involve a template parameter of the partial specialization except when the argument expression is a simple identifier. **(C2)**
- The type of a template parameter corresponding to a specialized non-type argument shall not be dependent on a parameter of the specialization. **(C3)**

我标记了我发现相关的前三个Clauses (第三个是有问题的)。根据C1 (在我们的例子中是),我们有一个专门的非类型参数,所以C2应该支持,但是这是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <class T, T t> struct C {};
template <class T> struct C<T, 1>;

实际上是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <class T, T t> struct C {};
template <class T> struct C<T, T(1)>; // notice the value initialization

因此,部分专门化的非类型参数T t在标识符以外的表达式中涉及部分专门化class T的模板参数;此外,此类专门化必然会在值初始化中涉及class T,这将始终违反规则。然后C3来为我们清除这一切,这样我们就不用每次都做那个推论了。

到目前为止,我们已经确定规则与自己是同步的,但这并不能证明情况2(一旦我们删除了最初的限制,所有其他相关的限制就会分崩离析)。我们必须深入研究匹配类模板、部分专门化的规则;偏序在这里被认为超出了范围,因为如果我们能够产生有效的候选项,则由程序员来组合一个格式良好的程序(即不创建类模板的模糊用法)。

部分

类模板部分专门化的匹配temp.class.spec.match

描述模板专门化所涉及的(给予或接受)“模式匹配”过程。规则1是过程的整体工作流程,随后的规则是定义正确性的规则。

  1. 如果可以从实际模板参数列表中推导出部分专门化的模板参数,则部分专门化与给定的实际模板参数列表匹配。
  2. 非类型模板参数也可以从主模板的非类型参数的实际模板参数的值中推导出来。
  3. 在引用类模板专门化的类型名称中,参数列表应与主模板的模板参数列表匹配。专门化的模板参数是从主模板的参数中推导出来的。

这些规则不违反,因为允许与专门化的非类型参数对应的模板参数的类型依赖于专门化的参数。因此,IMHO 没有明确的理由为什么不能在将来的语言修订版中使用这个特性:遗留问题应该归咎于。遗憾的是,我没有找到任何语言提案,主动引入这一功能。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32104890

复制
相关文章
面试将横表转换为竖表?
可以看出与要给出的结果一样其中还对会出现空做了判断,当然在真实的面试中还是不要画蛇添足了 5、这样也是可以达到效果的
技术从心
2019/08/06
8100
面试将横表转换为竖表?
将tensor转换为图像_tensor转int
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/07
11.4K0
MySQL 纵表转横表查询实现
INSERT INTO tb_test(attr, attr_value) VALUES('age', 18), ('sex', '男'), ('name', '授客'),('hobby', 'unknow');
授客
2020/09/24
5.1K0
MySQL 纵表转横表查询实现
SQL的单表查询
create database mydb1; Create database mydb2 character set gbk; Create database mydb3 character set gbk COLLATE gbk_chinese_ci;
全栈程序员站长
2021/07/22
2.2K0
SQL三表连接查询
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/135565.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/18
2.1K0
SQL之单表查询
附上下面要用到的数据库和表的 SQL 语句,在数据库管理页面新建一个查询然后使用 CV 大法转移过去执行即可:
wsuo
2020/07/30
1.8K0
SQL数据查询之——单表查询
一、SQL数据查询的一般格式 数据查询是数据库的核心操作。SQL提供了SELECT语句进行数据查询,其一般格式为: SELECT [ALL | DISTINCT]<目标列表达式>[,<目标列表达式>]··· FROM<表名或视图名>[,<表名或视图名>···] | (SELECT语句>)[AS]<别名> [WHERE<条件表达式>] [GROUP BY<列名1>[HAVING<条件表达式>]] [ORDER BY<列名2>[ASC | DESC]]; 整个SELECT语句的含义是,根据WHERE子句的条件表
Zoctopus
2018/06/04
1.8K0
sql server 连接查询_连表查询语句
连接查询包括合并、内连接、外连接和交叉连接,如果涉及多表查询,了解这些连接的特点很重要。
全栈程序员站长
2022/10/05
3.4K0
SQL数据查询之——单表查询
数据查询是数据库的核心操作。SQL提供了SELECT语句进行数据查询,其一般格式为:
Twcat_tree
2022/11/30
1.7K0
用DBMS_REDEFINITION将普通表转换为分区表
这些方案的思路都是创建一个新的分区表,然后把旧表的数据转移到新表上面,接着转移相应的依赖关系,最后进行表的重命名,把新表和旧表rename。与前三种方案相比,DBMS_REDEFINITION几乎不影响旧表的正常使用,因此也逐渐成为目前普遍使用的转换分区表的方案。
星哥玩云
2022/08/18
4780
JavaScript SheetJS将 Html 表转换为 Excel 文件
在本教程中,我们可以在客户端从我们的 HTML 表数据创建一个 excel 文件。即使用javascript将HTML 表导出到Excel (.xlsx)。
全栈程序员站长
2022/09/09
5.4K0
如何使用Python将图像转换为NumPy数组并将其保存到CSV文件?
Python 是一种功能强大的编程语言,具有大量的库和模块。其中一个库是 NumPy,它用于数值计算和处理大型多维数组和矩阵。另一个用于Python图像处理的流行库是Pillow,它是Python Imaging Library(PIL)的一个分支。
很酷的站长
2023/08/11
4820
如何使用Python将图像转换为NumPy数组并将其保存到CSV文件?
使用导出导入(datapump)方式将普通表切换为分区表
      随着数据库数据量的不断增长,有些表需要由普通的堆表转换为分区表的模式。有几种不同的方法来对此进行操作,诸如导出表数据,然后创建分区表再导入数据到分区表;使用EXCHANGE PARTITION方式来转换为分区表以及使用DBMS_REDEFINITION来在线重定义分区表。本文描述的是使用导出导入方式来实现,下面是具体的操作示例。
Leshami
2018/08/13
9400
【T-SQL基础】01.单表查询-几道sql查询题
概述: 本系列【T-SQL基础】主要是针对T-SQL基础的总结。 本篇主要总结了常见的对单表查询的SQL查询题目。 首先我们必须了解SQL查询的各字句在逻辑上按以下顺序进行处理: 1.FROM 2.W
悟空聊架构
2018/05/18
2K0
sql学习笔记(三)—— 联表查询
既然是联表查询,那肯定得多个表啊,所以,我们先创建一个教师表,表名为 teacher,并且向表中插入数据。
CherishTheYouth
2019/09/11
1.1K0
sql学习笔记(三)—— 联表查询
java map 转string_java-将Map <String,Object>转换为Map <String,String>
Map map = new HashMap(); //Object is containing String
全栈程序员站长
2022/08/25
12.3K0
mybatis中的动态sql表现为_MybatisPlus
Mybatis如何分页查询?Mysql中可以使用limit语句,但limit并不是标准SQL中的,如果是其它的数据库,则需要使用其它语句。MyBatis提供了RowBounds类,用于实现分页查询。RowBounds中有两个数字,offset和limit。
全栈程序员站长
2022/11/09
1.1K0
mybatis中的动态sql表现为_MybatisPlus
ActiveRecord
MybatisPlus支持ActiveRecord形式调用,实体类只需继承Model类即可进行强大的CRUD操作
阿超
2022/08/17
2260
ActiveRecord
SQL92&SQL99实现三表联合查询
–给city表添加测试数据 insert into city values(1,‘商丘’,‘历史闻名古都’); insert into city values(2,‘邯郸’,‘历史闻名古都’); insert into city values(3,‘洛阳’,‘历史闻名古都’); insert into city values(4,‘开封’,‘历史闻名古都’); –将部门表中的loc字段设置为城市表的城市编号 update dept set loc=‘1’ where deptno=50; update dept set loc=‘2’ where deptno=40; update dept set loc=‘3’ where deptno=30; update dept set loc=‘4’ where deptno=20; update dept set loc=‘4’ where deptno=10; –完成三表联合查询 –SQL92实现:查询员工信息及部门名称及所在城市名称并且员工的工资大于2000或者有奖金 –特点:易于书写,难于阅读 –缺点:92的SQL语句结构不清晰 –用法: –select 内容 (别名,连接符,去除重复,oracle函数,逻辑运算) –from 表名1,表名2,表名3… –where 条件(连接条件,普通筛选条件,where子句关键字) –group by 分组字段 –having 多行函数筛选 –order by 排序字段 select e.*,d.dname,c.cname from emp e,dept d,city c where (e.deptno=d.deptno and d.loc=c.cid and sal>2000) or (e.deptno=d.deptno and d.loc=c.cid and comm is not null) order by e.sal –SQL99实现:查询员工信息及部门名称及所在城市名称并且员工的工资大于2000或者有奖金 –特点:难于书写,易于阅读 –使用: –select 内容 from 表名1 – inner join 表名2 – on 连接条件 –inner join 表名3 –on 连接条件 –where 普通筛选条件 –group by 分组 –having 多行函数筛选 –order by 排序 select * from emp e inner join dept d on e.deptno = d.deptno inner join city c on d.loc =c.cid where e.sal>2000 or e.comm is not null order by e.sal
葆宁
2019/04/19
1.2K0
SQL92&SQL99实现三表联合查询
点击加载更多

相似问题

将SQL查询转换为ActiveRecord查询

14

将SQL查询转换为Activerecord查询

110

将ActiveRecord查询转换为sql

13

将SQL转换为ActiveRecord查询

14

将sql查询转换为activerecord

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文