- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
Partial ordering of function templates containing template parameter packs is independent of the number of deduced arguments for those template parameter packs.
template<class...> struct Tuple { };
template< class... Types> void g(Tuple<Types ...>); // #1
template<class T1, class... Types> void g(Tuple<T1, Types ...>); // #2
template<class T1, class... Types> void g(Tuple<T1, Types& ...>); // #3
g(Tuple<>()); // calls #1
g(Tuple<int, float>()); // calls #2
g(Tuple<int, float&>()); // calls #3
g(Tuple<int>()); // calls #3
以上内容转自partial ordering of overload function templates .我不太明白为什么g(Tuple<int>()); // calls #3
.具体来说,为什么不能 #2
叫做?以下是我的推理,如有错误请指出:
注意:我会忽略#1
b/c 解释得很好 here
第 1 步:推导和替换以及重载决议得出这些:
第 2 步:转换两个函数模板:
Step3:这是一个函数调用上下文,类型是函数调用有参数的那些函数参数类型:
3) If P is a reference type, the type referred to by P is used for deduction.This seems fine.
If P has one of the forms that include a template parameter list < T> or < I>, then each element Pi of that template argument list is matched against the corresponding template argument Ai of its A. If the last Pi is a pack expansion, then its pattern is compared against each remaining argument in the template argument list of A. A trailing parameter pack that is not otherwise deduced, is deduced to an empty parameter pack.
Step4:如果最后一步正确。那么这意味着#3 并不比#2 更专业。因此对于应该解析到哪个函数模板是不明确的。
更新:我想我误解了上面的相关引述。当我们将 P 中的模板参数与 A 中的模板参数进行匹配时,它们是逐字匹配的,这意味着当我们匹配时,对函数调用参数和参数所做的所有转换和分析都不会再次应用P/A中的模板参数/参数(实际上是函数调用参数/参数)。然后它会在上面的第 3 步 中推断出 Tuple< T1, Types&...>
失败。来自 Tuple< C1, Pack1...>)
.所以#3
更专业。
最佳答案
重载决议的第一步是找到所有候选者。来电g(Tuple<int>())
, 有三个可行的候选者:
g(Tuple<int>); // #1: [Types = {int}]
g(Tuple<int>); // #2: [T1 = int, Types = {}]
g(Tuple<int>); // #3: [T1 = int, Types = {}]
从转换序列的角度来看,这三个都是同样可行的候选者(因为,当然,它们都采用相同的参数,即输入的完全匹配)。它们都是函数模板特化,因此我们也无法在此基础上进行区分。
所以我们只剩下函数模板偏序了。我们为每个重载合成类型,并尝试使用我们合成的类型针对每个其他重载执行模板推导。更简单的比较是 (1) vs (2) 和 (1) vs (3)。在那里,我们有 [temp.deduct.partial]:
If A was transformed from a function parameter pack and P is not a parameter pack, type deduction fails.
自从我们转换Types...
进入UniqA...
,第一个参数为T1
, 类型推导失败。这使得 (2) 和 (3) 都比 (1) 更专业。所以现在我们比较 (2) 和 (3)。
首先,我们可以从 (3) 推导出 (2) 吗?
template <class T1, class... Types> void g(Tuple<T1, Types...> );
g(Tuple<Uniq3, Uniq3Pack&...>());
当然,没问题T1 == Uniq3
和 Types... == Uniq3Pack&...
.接下来,我们尝试另一个方向:
template <class T1, class... Types> void g(Tuple<T1, Types&...> );
g(Tuple<Uniq2, Uniq2Pack...>());
这失败了,因为 Uniq2Pack
不是一组引用类型和 Types&...
是。由于演绎只在一个方向上成功,这使得 (3) 成为更专业的重载。
因为它是最后一位,所以 (3) 是最可行的候选者。这似乎违反直觉,因为我们实际上并没有使用引用类型调用它 - 但它仍然是最佳选择。
关于c++ - 包含模板参数包的函数模板的部分排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33426038/
通过终端,您可以使用命令 - “SetFile -a B 文件名” 以编程方式,我认为我应该通过[[NSFileManager defaultManager] createDirectoryAtPat
嗨,正在尝试书中的一些示例:Practical Graph mining with R对于子图挖掘: library(subgraphMining) library(igraph) graph1 =
代码中的相同问题: class Foo { int getIntProperty () { ... } CustomObject getObjectProperty () { ... }
所以这可能是一个愚蠢的问题,但它已经困扰我一段时间了。 使用 React,我创建了两个组件(Buttons.js 和 Message.js),每个组件都有一个导出。但是,现在我希望将这两个组件用作 n
从今天早上开始,我发现我无法再从某个范围安装任何 NPM 包(或任何具有依赖项的包)。例如,如果我输入 npm i webpack 我会收到以下错误... npm ERR! code E401 npm
我在这里搜索过,Angular 2, @ngtools/webpack, AOT ,但对我不起作用。我运行了 npm install 命令。我正在做的是创建一个新的 Angular 2 项目。当我运行
情况: 我有一个 Swift 包,将其命名为 lib。 lib 位于其自己的存储库中。在lib的仓库中,有一堆本地包;也就是说,这些包是在 lib 中定义的,使用本地路径依赖格式 .package(p
我想在工作中学习和使用nodejs,但是在使用 de npm 命令安装模块/包时遇到网络问题。我是否可以使用我的家用计算机构建完整的 Node js 包,然后将其安装在另一台计算机(我的工作场所计算机
我需要将一些 .tar.bz2 格式的非 Python 包转换为 Anaconda/miniConda .egg 文件并安装它们。为此,我需要一个适用于 Windows 的 bld.bat 文件。互联
我需要共享库文件 libthrift-0.9.3.so 作为其他包的依赖项。我在构建 thrift-0.9.3 包时看到编译问题(我确实从 https://thrift.apache.org/down
我尝试在 R 版本 3.5.0 中安装“arcgisbinding”包。但是我失败了,得到以下错误和警告。 Installing package into ‘C:/Users/Lenovo/Docum
我尝试在 R 版本 3.5.0 中安装“arcgisbinding”包。但是我失败了,得到以下错误和警告。 Installing package into ‘C:/Users/Lenovo/Docum
我试图在 flutter 中测试这个应用程序,但我无法运行该应用程序,因为出现此错误“名称‘Page’在库‘package:burn_off/widgets/page.dart’和‘package’中
试图理解和学习如何编写包...用我一直使用的东西进行测试,记录... 您能帮我理解为什么“日志”变量不起作用...并且屏幕上没有日志记录吗? 谢谢! 主要文件: #!/opt/local/bin/py
我尝试运行此使用 Google 云的代码。 import signal import sys from google.cloud import language, exceptions # creat
我想知道是否有人找到了一个很好的 R 包来分析眼动追踪数据? 我遇到了 eyetrackR,但据我所知,没有可用的英文支持文档: http://read.psych.uni-potsdam.de/pm
我正在 R 上制作一个包。我有两个函数共享一个变量(全局)。 如何将其导入到包中? 例如, m<-0 f<-function() { m <- m+1 } g<-function() { m <- m
我用 C 为 Lua 编写了很多模块。每个模块都包含一个 Lua 用户数据类型,我像这样加载和使用它们: A = require("A") B = require("B") a = A.new(3,{
我正在尝试在 R 中的 Ubuntu 上安装 xlsx 包,以便使用允许在 R 中插入链接然后将它们导出到 Excel 的功能。 话虽如此,我根本无法安装该软件包。 显然它必须与 rJava 一起使用
我想在 Haskell 中做一些蒙特卡洛分析。我希望能够编写这样的代码: do n <- poisson lambda xs <- replicateM n $ normal mu sigma
我是一名优秀的程序员,十分优秀!