为什么这些模板不明确?

2024-04-02

这本书C++ 模板:完整指南 https://rads.stackoverflow.com/amzn/click/com/0201734842第 275 页有一个例子,我无法理解它。

引用书中的摘录...

template <typename T>
class Promotion<T,T> {
  public:
    typdef T ResultT;
};

template<typename T1, typename T2>
class Promotion<Array<T1>, Array<T2> > {
  public:
    typedef Array<typename Promotion<T1,T2>::ResultT> ResultT;
};

template<typename T>
class Promotion<Array<T>, Array<T> > {
  public:
    typedef Array<typename Promotion<T,T>::ResultT> ResultT;
};

不幸的是,部分专业化Promotion<Array<T1>, Array<T2> >是 既不比部分专业化更专业化,也不比部分专业化更不专业化Promotion<T,T>。为了避免模板选择歧义,最后部分 增加了专业化。它比之前的任何一个都更专业 两个部分专业。

为什么前两个模板不明确,为什么最后一个模板解决了不明确问题?当我尝试应用规则时,我要么无法弄清楚它是如何产生歧义的,要么我认为我有办法让它发生,但我不知道为什么最后一个模板解决了问题。


也许您的困惑源于“比”更专业的关系如何运作。它是偏序,而不是全序——这意味着给定 2 个模板专业化,并不总是其中一个比另一个更专业。

Anon 的评论是正确的:假设第三个专业化不存在,并且稍后在您的代码中您有:

Promotion<Array<double>, Array<double> > foo;

(当然,您可能实际上不会创建此空结构类型的变量,但这只是强制实例化的最简单方法。)

鉴于此声明foo,会选择前 2 个专业中的哪一个?

  • 专业化 1 适用,并且T = Array<double>.
  • 专业化 2 适用,其中T1 = double, T2 = double.

两种专业都适用,因此我们需要确定哪个“比”另一个“更专业”,然后选择那个。如何?我们会说X比更专业Y如果是至少同样专业 as Y, but Y至少不像X。虽然这看起来只是在绕这个问题,但我们可以用一个巧妙的规则来回答这个新问题:

X至少与Yif,无论我们分配给模板参数什么类型X,结果类型总是可以匹配Y.

请注意,我们忘记了当前实例化中涉及的特定类型(在本例中,double)——“至少与”关系一样专业化是部分专业化本身的属性,并且不依赖于特定的实例化。

专业化 1 总是可以与专业化 2 匹配吗?这个过程有点像代数。我们要求这样做any type T,我们可以找到类型T1 and T2这样:

Promotion<Array<T1>, Array<T2> > = Promotion<T, T>

这意味着:

Array<T1> = T
Array<T2> = T

所以答案是否定的。给定任何类型,仅查看第一个隐含结果T,一般来说是找不到类型的T1这样Array<T1>与以下类型相同T。 (如果T碰巧是Array<long>,但不是如果T is int or char*或大多数其他类型。)

反过来呢?专业化 2 总是可以与专业化 1 匹配吗?我们要求这样做any types T1 and T2,我们可以找到一个类型T这样:

Promotion<T, T> = Promotion<Array<T1>, Array<T2> >

暗示:

T = Array<T1>
T = Array<T2>

所以答案又是否定的。给定任何类型T1,总是可以找到一种类型T这样T与以下类型相同Array<T1>-- 按字面意思设置T = Array<T1>。但一般来说其他类型T2不限于与T1,如果不是(例如,如果T1 = bool but T2 = float)那么就不可能找到类型T这与两者相同Array<T1> and Array<T2>。所以一般情况下是不可能找到这样的类型的T.

在这种情况下,不仅两个专业化都不比另一个更专业化,甚至也不比另一个专业化更专业化。专业化如另一个。因此,如果需要实例化此模板类并且两个专业化都匹配(正如 Anon 给出的示例所示),则无法选择“最佳”模板类。

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

为什么这些模板不明确? 的相关文章

  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • 将上下文传递给自定义挂钩或在自定义挂钩内调用 useContext 更好吗?

    我有越来越多的自定义挂钩 其中许多通过以下方式访问相同的反应上下文useContext钩 在许多组件中 需要使用多个自定义挂钩 打电话比较好吗useContext每个组件一次并将上下文传递到我的自定义挂钩中 还是最好调用useContext
  • 如何删除/取消注册 GitLab 运行程序

    几个月前我注册了一个个人 GitLab 运行器 但我不再使用它 如何完全删除它 使其不会显示在我的 GitLab CI CD 设置页面上 列出跑步者以获取他们的令牌和 URL sudo gitlab runner list 使用指定运行者令
  • Android 10.0 应用程序在 BOOT 上启动

    我们有一个 Android 应用程序 我们打算在手机启动期间启动 启动 通过在 Android 10 中尝试一些代码 我们意识到在 Android 8 0 之后无法在启动时启动应用程序 以前在 Android 6 中 这是可能的 即使在物理
  • Heroku Dynos 是否享受 AWS 网络内的免费数据传输?

    我正在考虑将 Heroku 用于 NodeJS 应用程序 我想知道他们的 Dynos 是否享受 AWS 网络内的免费内部数据传输 我想使用 DynamoDB ElastiCache RDS SQS 和许多其他 AWS 产品 如果我可以从 H
  • 如何使用 OpenXML 查找段落中的页码?

    For a 段落对象 如何使用 Open XML SDK 2 0 for Microsoft Office 确定该对象位于哪个页面 使用以下方法无法获取 Word 文档的页码OpanXml Sdk因为这是由客户端处理的 例如 MS Word
  • 推送 UIView 时隐藏 UITabBar

    我有一个UITabBarController其中默认视图控制器是UINavigationController 当我在视图中推送某个视图时 我希望能够隐藏 UITabBarController 的 UITabBarUINavigationCo
  • 如何获取任务的结果或返回值?

    有人可以向我解释如何返回任务的结果吗 我目前正在尝试执行以下操作 但我的任务没有返回我期望的列表 这里有什么问题 static void Main List
  • 无法读取 null 的属性“props” - Reactjs [重复]

    这个问题在这里已经有答案了 基本上我想在子组件中调用父组件的函数 该函数将更改父组件的状态 我在父组件中创建了一个处理程序并将其作为道具传递给子组件 现在我想在子组件中调用它 Parent state formstep 1 construc
  • 如何覆盖 laravel 资源路由默认方法?

    我的 REST API url 具有以下架构 Verb Url Method GET tasks findAll GET tasks id findOne POST tasks create PUT tasks id update DELE
  • 读取行期间的 Source.fromInputStream 异常处理

    我创建了一个函数 其中接受输入流作为参数并返回由字符串组成的迭代器 我按如下方式完成此操作 def lineEntry fileInputStream InputStream Iterator String Source fromInput
  • Common Lisp 中的(随机)不那么随机?

    好的 最后一个问题 我将用 Common Lisp 完成我的猜数游戏 D 每当游戏开始 或者在第一个游戏之后开始新游戏 时 都会调用以下函数 Play the game defun play If it s their first time
  • Symfony v4、php bin/console 无法按预期工作。自动中止[重复]

    这个问题在这里已经有答案了 我刚刚在我的新 SSD 上安装了 Composer php apache 等 之后我想开始编码 我从 IDE 中的另一个驱动器打开了我的项目 然后我想将我的灯具加载到我的新数据库中 但我不能 我什至无法进行迁移等
  • 如何使用 Selenium 和 Python 单击文本为(全选)的下拉项

    编辑 关于这个page https i stack imgur com mdjih png 我正在尝试提交从数据库生成的报告的参数 我已经能够为 send keys 发送第一个字段的新开始日期 第二个字段 结束日期 保持不变 对于第三个字段
  • 如何重新创建与默认 tableView:viewForHeaderInSection: 相同的默认 UIView?

    我尝试实施 UIView tableView UITableView tableView viewForHeaderInSection NSInteger section 获取标题部分的文本标签为黑色而不是白色 但它看起来与SDK创建的默认
  • Oracle 即时客户端:ORA-28759:无法打开文件

    我拥有 red hat 6 服务器 具有 TCPS 连接设置的远程 Oracle 数据库 从 rpm 安装的 oracle 即时客户端 basic odbc sqlplus 我正在尝试设置 Oracle 即时客户端来连接到远程数据库 输入命
  • Django REST 框架中的 405“不允许方法 POST”

    我正在使用 Django REST 框架来实现 Get Post api 方法 并且 GET 可以正常工作 但是 当发送 post 请求时 会显示下面的 405 错误 我在这里缺少什么 405 Method Not Allowed deta
  • 如何在使用 oauthlib.oauth2 fetch_token 时捕获 API 失败

    Python3fetch token该库中的方法在使用响应之前不会检查响应状态 如果它进行的 API 调用失败 则响应将无效并且脚本崩溃 我是否可以设置一些内容 以便在库读取响应之前在不成功的响应上引发异常 import requests
  • 如何永久移动闭包

    我正在设计一个为我运行闭包的小结构 我可以将它们设置为停止 pub fn run self f Box
  • MySQL 事件调度的性能影响

    我有一个在 MySQL 数据库上创建临时用户 然后在 24 小时后删除它们的用例 我会做足够多的事情 我想自动化该过程并将其与用户创建脚本打包在一起 这样我就不必跟踪该过程 我在互联网上查找了有关 MySQL 事件调度的性能影响的文档 问题
  • 为什么这些模板不明确?

    这本书C 模板 完整指南 https rads stackoverflow com amzn click com 0201734842第 275 页有一个例子 我无法理解它 引用书中的摘录 template