C++ 模板正式排序规则

2024-03-29

我很难理解 D. Vandevoorde 和 N. M. Josuttis 所著的《C++ 模板完整指南》一书第 12 章中描述的正式排序规则的工作原理。在本书第 188 页,作者给出了以下场景,用于确定两个可行的函数模板中哪一个更专业:

从这两个模板中,我们通过替换前面描述的模板参数来合成两个参数类型列表:(A1) and (A2*) (where A1 and A2是独特的组成类型)。显然,通过替换,第一个模板对第二个参数类型列表的推导成功了A2* for T。然而,没有办法使T*第二个模板的匹配非指针类型A1在第一个列表中。因此,我们正式得出结论,第二个模板比第一个模板更专业。

我想了解一下这个例子。

Edit

我相信上面引用中提到的两个函数模板是

template<typename T>
int f(T)
{
    return 1;
}

template<typename T>
int f(T*)
{
    return 2;
}

这些规则解释起来比使用起来要困难一些。这个想法是,如果更专业化的模板的可能实例化集合是不太专业化模板的可能实例化集合的严格子集,则一个模板比另一个模板更专业化。

也就是说,每一种可以用作更专业的参数的类型也可以用作不太专业的参数,并且至少有一种类型可以与不太专业的类型一起使用,但不能与更专业的类型一起使用。

给定两个模板:

template <typename A> void f( A );   // [1]
template <typename B> void f( B* );  // [2]

要解决的问题是哪一个更generic(即可以采用更多数量的参数)。标准中的整个描述是根据用于的合成独特类型来完成的A and B,但我们可以尝试以不太精确的方式通过挥手来解决。

假设我们找到一个类型X匹配第二个模板参数,那么第二个模板的实例化将如下所示void f( X* )(除了它是一个模板这一事实)。现在,模板 [1] 可以用来生成等效的函数吗?是的,通过制作A == X*在类型推导中。我们可以反方向做吗?假设我们找到一个类型Y我们可以用它实例化第一个模板,我们得到void f( Y )。第二个模板可以匹配这个调用吗?不,仅适用于以下类型的子集pointers前面的说法可以成立。

这意味着第二个模板更专门,因为对于第二个模板的每个有效实例化,我们也可以实例化第一个模板,但是第一个模板的某些实例化不是第二个模板的有效实例化。

举一个实际的例子,f( char* )两个模板都可以匹配,但是f( 5 )只能与第一个匹配。关于合成类型的奇怪解释的原因是单个示例不能保证顺序,它必须保持all类型。合成型的代表是any type.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 模板正式排序规则 的相关文章

随机推荐

  • 如何将 3D 模型从 Cinema4D 导出到 Three.js?

    如果我有一个网格建模4D影院 我怎样才能将其导出three js http github com mrdoob three js3D JS 引擎 另外 导出材料也很方便colors for 多边形选择 为此 我刚刚为 Cinema4D 编写
  • 在VBA中处理错误时如何管理无错误情况? [复制]

    这个问题在这里已经有答案了 我需要使用以下命令捕获一些 VBA 错误GoTo陈述 Sub mySub On Error GoTo errorHandler Workbooks Open myWorkbook Some Code errorH
  • 更改 ggplot 中某些类别的线型?

    我有一些数据 library reshape2 library ggplot2 df data frame cat LETTERS 1 6 VAR1 runif 6 VAR2 runif 6 VAR3 runif 6 VAR4 runif
  • Bash 脚本:使用 Expect 将文件发送到 SFTP

    我必须将一些 gzip 压缩文件从本地服务器发送到 SFTP 服务器 我的服务器信息 发行商 ID Ubuntu 说明 Ubuntu 12 04 4 LTS 发布 12 04 代号 精确 创建了一个 bash 脚本 并且能够将文件发送到 s
  • 仅绘制 QPainter Path 贝塞尔曲线的部分

    我只想绘制 QPainter 曲线路径的一部分 我的路径是这样的 QPointF p 4 p 0 QPoint 100 200 p 1 QPoint 200 60 p 2 QPoint 500 180 p 3 QPoint 600 100
  • 训练鲁棒级联分类器时要考虑的建议?

    我正在训练级联分类器以检测图像中的动物 不幸的是 我的误报率相当高 使用 Haar 和 LBP 超高 使用 HOG 可以接受 我想知道如何改进我的分类器 这是我的问题 鲁棒检测所需的训练样本量是多少 我在某处读到需要 4000 个正样本和
  • R 控制台可以支持后台任务或中断(事件处理)吗?

    在 R 控制台中工作时 我想设置一个后台任务来监视特定连接 并在发生事件时执行另一个函数 警报 或者 我可以进行设置 以便外部函数仅向 R 发送警报 但这似乎是同一个问题 有必要设置一个侦听器 我可以在 R 的专用进程中执行此操作 但我不知
  • 创建对象时抛出异常

    执行catch语句时是否会创建异常对象 例如 catch ArithmeticException someObject 该对象是否不必显式创建为实例 有两件事创建异常的实例第二抛出异常 创建异常的实例例如 看起来像创建类的任何实例NullP
  • Ansible 中的角色和任务(和标签)有什么区别?

    我发现自己很困惑roles and tasks每时每刻 我知道标签是标记单个项目的一种方式 但我很困惑如何使用它们 假设我必须执行以下操作 Users Create a user named deploy Add ssh key for d
  • 如何解组嵌套的未知字段

    我分叉了一个很棒的项目here https github com sridharv reddit go blob master types go 并且刚刚把它弄得一团糟 学习了一些Go 我无法弄清楚的问题是有关自定义解组的一些事情 如果您看
  • 如何从作业中设置环境变量并在詹金斯的下一个作业中使用它?

    我想要一份设置环境变量的工作 并在接下来的所有工作中使用这些环境变量 如何通过 Jenkins 设置环境变量 从技术上讲 您无法将环境变量从一个作业传递到下一个作业 而且我不知道有一个插件可以开箱即用地执行此操作 不过有一个技巧 这个想法是
  • 如何使用多个类的序列化来实现备份和恢复?

    我正在尝试序列化存储在 JTable 中的对象 名称和注释 我希望能够将此信息保存到文件中 并且当我加载程序时 该信息应加载到 JTable 中 当我单击备份按钮时 正在创建一个文件 但没有存储任何数据 有人可以指导我正确的方向并告诉我我做
  • 将 Python Opencv 图像(numpy 数组)转换为 PyQt QPixmap 图像

    我正在尝试将 python opencv 图像转换为 QPixmap 我按照说明进行操作页面链接 http russellj tumblr com post 44845729156 convert python opencv image n
  • 编辑中的字段唯一(已采用)?

    当我编辑用户时 我遇到验证问题 因此 当我编辑时 我收到消息称该名称已被占用 我怎样才能解决这个问题 因为该名称属于该用户 所以我需要再次更改名称 以便我可以编辑我的用户 if user gt business user this gt v
  • 如何编辑 Visual Studio Code 的默认深色主题?

    我使用的是 Windows 7 64 位 有没有办法在 Visual Studio Code 中编辑默认的深色主题 在 USERPROFILE vscode文件夹中只有扩展中的主题 而在安装路径中 我使用默认值 C Program File
  • Windows Azure /Windows Server 2008 R2 中的 NAudio

    我在用NAudio http naudio codeplex com 将几个 mp3 文件合并在一起以形成 Windows Azure 产品 它在开发环境中工作正常 但一旦我将其上传到 Azure 我就会收到 无驱动器调用 acmForma
  • Java 中的 \x 转义?

    我想知道 Java 中是否有类似 C 中的十六进制 x 转义 例如 char helloworld x48 x45 x4C x4C x4F x20 x57 x47 x52 x4C x44 printf s helloworld 从目前看来
  • Vaadin:如何将 META-INF/服务添加到战争中?

    我有一个 Vaadin 7 maven Web 项目 其中有一些注释可以在其上创建服务定义META INF services 我将其添加到 pom 中 以便处理注释
  • GCP Pub/Sub,如果已经有活动订阅,您可以在新订阅上重播旧消息吗

    在 GCP Pub Sub 中 我有一个主题和一个Subscription1并已开始发布消息 我可以添加另一个订阅吗Subscription2并重播之前发布的旧消息Subscription2被创造了 它会允许吗 卡夫卡允许 在什么时候我会失
  • C++ 模板正式排序规则

    我很难理解 D Vandevoorde 和 N M Josuttis 所著的 C 模板完整指南 一书第 12 章中描述的正式排序规则的工作原理 在本书第 188 页 作者给出了以下场景 用于确定两个可行的函数模板中哪一个更专业 从这两个模板