- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我认为下面的代码格式正确:
template< typename T >
using IsSigned = std::enable_if_t< std::is_signed_v< T > >;
template< typename T, IsSigned< T >... >
T myAbs( T val );
也有人说它是病式的,因为C++17标准的§17.7 (8.3):
Knowing which names are type names allows the syntax of every template to be checked. The program is ill-formed, no diagnostic required, if: (...) every valid specialization of a variadic template requires an empty template parameter pack, or (...)
在我看来IsSigned< T >...
是一个依赖模板参数,因此在模板定义时不能根据 §17.7 (8.3) 检查它。 IsSigned< T >
例如可以是 void
对于 Ts 的一个子集,int
对于另一个子集或替换失败。对于 void
subset 确实如此,空模板参数包将是唯一有效的特化,但是 int
subset 可以有很多有效的特化。这取决于实际 T
争论。
这意味着编译器必须在模板实例化之后检查它,因为T之前是未知的。那时完整的参数列表是已知的,可变参数为零。该标准规定如下(§17.6.3 (7)):
When N is zero, the instantiation of the expansion produces an empty list. Such an instantiation does not alter the syntactic interpretation of the enclosing construct
这就是为什么我认为它的格式很好。
最佳答案
代码格式错误,不需要诊断。
如果std::is_signed_v<T>
, 然后 std::enable_if_t<std::is_signed_v<T>>
表示类型 void
.否则,std::enable_if_t<std::is_signed_v<T>>
不表示有效类型。因此,myAbs
的每个有效特化需要一个空的模板参数包。
根据 [meta.rqmts]/4 ,如果std::enable_if
,程序有未定义的行为是专门的。因此,上述行为无法改变。
In my opinion
IsSigned< T >...
is a dependent template parameter, therefore it can not be checked against §17.7 (8.3) in template definition time.IsSigned< T >
could be for examplevoid
for one subset ofT
s,int
for another subset or substitution failure. For thevoid
subset it is true, that the empty template parameter pack would be the only valid specialization, but theint
subset could have many valid specializations. It depends on the actualT
argument.
编译器无法检查它,就像它无法为您求解任意方程一样。 NDR(不需要诊断)正是为这种情况而设计的——程序格式错误,如果编译器确实能够检测到,则需要进行诊断。 NDR 允许编译器不检查它。
When N is zero, the instantiation of the expansion produces an empty list. Such an instantiation does not alter the syntactic interpretation of the enclosing construct.
我们说的规则是语义规则,不是句法规则,因为句法规则是以[gram]为单位的。
那么 NDR 规则的基本原理是什么?一般来说,它们解决的问题在实现策略中是不可重现的。例如,它们可能会导致代码在某些实现策略中行为不当,但不会在其他实现策略中引起任何问题(而且不容易)。
另外,请注意标准在程序方面使用诸如“格式错误”之类的术语。因此,谈论一个孤立代码片段的格式是否正确并不总是合理的。在这种情况下,std::enable_if
要求不专业,否则情况可能会变得更复杂。
关于c++ - 依赖非类型参数包 : what does the standard say?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57783393/
我在 gobject 上阅读了一个维基百科页面,上面写着, Depending only on GLib and libc, GObject is a cornerstone of GNOME and
如何注册一个依赖属性,其值是使用另一个依赖属性的值计算的? 由于 .NET 属性包装器在运行时被 WPF 绕过,因此不应在 getter 和 setter 中包含逻辑。解决方案通常是使用 Proper
我一直在尝试将 ActionbarSherlock maven 依赖项添加到我的项目中 com.actionbarsherlock library 4.2.0 在我的 po
http://tutorials.jenkov.com/ood/understanding-dependencies.html#whatis说(强调我的): Whenever a class A us
我对所有这些魔法有点不清楚。 据我了解,依赖属性是从 DependencyObject 继承的,因此存储值: 如果分配了值(在本地字典中),则在实例本身中 或者如果未指定值,则从指向父元素的链接中获取
我刚刚更新了在 ASP.NET Framework 4.5.2 版上运行的 MVC Web 应用程序。我正在使用 Twilio 发送 SMS 消息: var twilio = new TwilioRe
我刚刚发现了一件令人生畏的事情。 spring 依赖坐标有两个版本。 项目依赖于 spring mvc 和 spring flow。有两组并行的依赖项。 Spring MVC 具有以下方案的依赖项
我正在尝试包含 的 maven 依赖项 org.jacorb jacorb 2.3.1 依赖已解决,但它导致另一个依赖 picocontainer 出现问题: [ERROR
我正在尝试在 Haskell 项目中包含特定版本的库。该库是住宿加早餐型的(用于 martix 操作),但我需要特定的 0.4.3 版本,该版本修复了乘法实现的错误。 所以,我的 stack.yaml
有谁知道如何制作依赖的 UIPickerView.例如,当我选择组件一的第 2 行时,组件二的标题会发生变化吗? 我在互联网上查找过,没有真正的答案,我尝试过使用 if 和 switch 语句,但它们
我正在编写一个用于验收测试的项目,由于各种原因,这依赖于另一个打包为 WAR 的项目。我已成功使用 maven-dependency-plugin 解压 WAR,但无法让我的项目包含解压的 WEB-I
或多或少我在 session 上大量构建我的网站(特别是重定向用户等),我很好奇这是否是一种危险的做法。禁用浏览器 cookie 保存的用户的大致比例是多少?我愿意接受任何建议:) 谢谢 最佳答案 s
开始玩 Scala futures,我被依赖的 futures 困住了。 让我们举个例子。我搜索地点并获得 Future[Seq[Place]]。对于这些地点中的每一个,我搜索最近的地铁站(该服务返回
或多或少我在 session 上大量构建我的网站(特别是重定向用户等),我很好奇这是否是一种危险的做法。禁用浏览器 cookie 保存的用户的大致比例是多少?我愿意接受任何建议:) 谢谢 最佳答案 s
我有一个二进制文件,需要一些 *.so 文件才能执行。现在,当我尝试在一些旧机器上执行它时,它会显示 /lib/libc.so.6: version `GLIBC_2.4' not found 如何将
我尝试使用 Dygraph 来表示图表,我在 https://github.com/danvk/dygraphs 中找到了代码,但是它有太多的依赖文件,我觉得很烦人。是否有一个文件可以容纳所有必需的
我正在处理一个 javascript 文件,该文件 a) 声明一个具有函数的对象,并且 b) 使用它期望在外部声明的散列调用该对象的 init 函数。我的 Jasmine 规范提示它找不到哈希,因为它
最近我一直在学习 Angular 并且进展顺利,但是关于依赖注入(inject)的一些事情我仍然不清楚。 是否有任何理由在我的 app.js 文件中声明我的应用程序的其他部分(服务、 Controll
考虑一个名为 foo 的表,它有 id (PRIMARY & AUTO_INCREMENT) 列。我正在向该表中插入一行,挑战从此时开始。 $db->query("INSERT INTO `foo`
我正在使用级联下拉 jquery 插件。 (https://github.com/dnasir/jquery-cascading-dropdown) 我有两个下拉菜单。 “客户端”和“站点”。 根据您
我是一名优秀的程序员,十分优秀!