如何确定函数特化的主要模板?

2024-04-12

函数模板专业化的主要模板通常是非常直观的,但是,我正在寻找正式的规则来理解更令人惊讶的情况。例如:

template <typename T, typename U>
void f(T, U) {}     // (1)

template <typename T>
void f(T, T) {}     // (2)

template <>
void f(int, int) {} // (3); specializes (2), not (1); why?

理论上,(3) 也可能是 (1) 的特化,但实验表明事实并非如此。


让我们重点关注通用模板 (1) 和 (2) 的声明。 这是两个不同的模板,例如(2) 不是 (1) 的特化。好的,现在当我们编写专业化时:

template <>
void foo(int, int) {}

在推断要专门化的模板时,编译器将识别两个候选模板。然后,它必须选择哪个是best fit。这种选择的过程称为“函数模板的部分排序” http://en.cppreference.com/w/cpp/language/function_template。所选报价:

当相同的函数模板特化匹配多个重载函数模板时(这通常是由模板参数推导引起的),将执行重载函数模板的部分排序以选择最佳匹配。

我们打电话吧S匹配模板集。然后,对于每一对(f1, f2) in S,编译器将转换f1通过在其类型(或非类型)参数上应用虚拟类型(或值)。然后它尝试将其与f2。然后它通过转换执行相同的过程f2并尝试将其与f1。最后,在检查每一对之后,编译器可以确定哪个模板候选是最专业的。如果不这样做,编译就会失败。

在我们的例子中,我们有两个匹配的模板,因此我们应用上述过程:

  • 变换后的 (1) 应用于 (2):用 T = T1 且 U=T2 表示 foo。它尝试与(2)匹配:推演失败
  • 转换后的 (2) 应用于 (1):foo(T1, T1),当应用于 (1) 时,它解析为 T = T1 且 U = T1。

从这个过程中,编译器推断出 (2) 比 (1) 更专业,并且您的专业化适合 (2)。当编译器专注于特定调用时,在重载决策期间应用相同的过程。

以下是说明所有此过程的示例(摘自@Yakk 的评论):

template <typename T, typename U>
void f(T, U) { std::cout << "f(1)\n"; }     // f(1)

template <typename T>
void f(T, T) { std::cout << "f(2)\n"; }     // f(2)

template <>
void f(int, int) { std::cout << "f(3)\n"; } // f(3); specializes f(2), not f(1); why?

// Now the same specialization but without any template overload...
template <typename T, typename U>
void g(T, U) { std::cout << "g(1)\n"; }     // g(1)

template <>
void g(int, int) { std::cout << "g(3)\n"; } // g(3); No ambiguity, specializes g(1)

接下来,让我们执行一些调用:

f(1, 1);            // Prints f(3)
f<int>(1, 1);       // Prints f(3)
f<int, int>(1, 1);  // Prints f(1)
f(0.1, 0.2);        // Prints f(2)

g(1, 1);            // Prints g(3)
g<int, int>(1, 1);  // Prints g(3)

这一切都可以在行动中看到这里 - 复制自@Yakk 的评论 http://coliru.stacked-crooked.com/a/ba4835ef93c33db1.

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

如何确定函数特化的主要模板? 的相关文章

  • Windows 10 Mobile (10.0.14393) 地理围栏后台任务 (LocationTrigger)

    自从10 0 14393 周年纪念更新 LocationTrigger似乎不起作用 我有 Windows Phone 8 1 应用程序 也适用于 UWP 应用程序 输出到的便携式库Windows Runtime Component图书馆 w
  • 具有不同大小结构的结构数组的 malloc()

    如果每个结构都包含一个大小不同的字符串数组 那么如何正确地 malloc 一个结构数组 因此每个结构可能有不同的大小 并且不可能 realloc 结构体数量 sizeof 结构体名称 after malloc 初始大小 sizeof 结构名
  • clang 格式换行符在错误的位置

    给出以下代码行 get abc manager get platform status abc platform status sw update status fill update status actions allowed stat
  • 在 VS2017 下使用 Conan 和 CMake 项目进行依赖管理

    我正在尝试使用 CMake 与 VS2017 集成为 C 设置一个开发环境 以便在 Linux x64 下进行编译 为了更好地管理依赖关系 我选择使用 Conan 但我对这个软件还很陌生 我想知道让 VS2017 识别项目依赖关系的最佳方法
  • System.IO.IOException:由于意外>数据包格式,握手失败?

    有谁知道这意味着什么 System Net WebException 底层连接已关闭 发送时发生意外错误 gt System IO IOException 由于意外 握手失败 数据包格式 在 System Net Security SslS
  • ASP.NET Core 与现有的 IoC 容器和环境?

    我想运行ASP NET 核心网络堆栈以及MVC在已托管现有应用程序的 Windows 服务环境中 以便为其提供前端 该应用程序使用 Autofac 来处理 DI 问题 这很好 因为它已经有一个扩展Microsoft Extensions D
  • 在 C# 中生成 HMAC-SHA1

    我正在尝试使用 C 来使用 REST API API 创建者提供了以下用于 hmac 创建的伪代码 var key1 sha1 body var key2 key1 SECRET KEY var key3 sha1 key2 var sig
  • C# 正则表达式用于查找 中具有特定结尾的链接

    我需要一个正则表达式模式来查找字符串 带有 HTML 代码 中的链接 以获取文件结尾如 gif 或 png 的链接 示例字符串 a href site com folder picture png target blank picture
  • CultureInfo 的实例(来自相同的文化)根据操作系统而变化

    我有一个网站 上面写着这样的日期 CultureInfo cultureInfo CultureInfo GetCultures CultureTypes AllCultures FirstOrDefault c gt string Equ
  • SFINAE 如何使用省略号?

    过去 当使用 SFINAE 选择构造函数重载时 我通常使用以下内容 template
  • 带 If 的嵌套 For 循环的时间复杂度

    void f int n for int i 1 i lt n i if i int sqrt n 0 for int k 0 k lt pow i 3 k do something 我的思考过程 执行if语句的次数 sum i 1 to
  • 无法解析远程名称 - webclient

    我面临这个错误 The remote name could not be resolved russgates85 001 site1 smarterasp net 当我请求使用 Web 客户端读取 html 内容时 出现错误 下面是我的代
  • TcpClient 在异步读取期间断开连接

    我有几个关于完成 tcp 连接的问题 客户端使用 Tcp 连接到我的服务器 在接受客户端后listener BeginAcceptTcpClient ConnectionEstabilishedCallback null 我开始阅读netw
  • 两种类型的回发事件

    1 我发现了两篇文章 每篇文章对两种类型的回发事件的分类都略有不同 一位资源说两种类型的回发事件是Changed事件 其中控件实现 IPostbackDataHandler 当数据在回发之间更改时触发 然后Raised事件 其中控件实现 I
  • 从 Code::Blocks 运行程序时出现空白控制台窗口 [重复]

    这个问题在这里已经有答案了 当我尝试在 Code Blocks 中构建并运行新程序时 控制台窗口弹出空白 我必须单击退出按钮才能停止它 它对我尝试过的任何新项目 包括 Hello world 都执行此操作 奇怪的是 它对于我拥有的任何旧项目
  • C++ 插件的“最适合”动态类型匹配

    我有一个几乎所有东西都是插件的架构 该架构以图形用户界面为基础 其中每个插件都由一个 表面 即用户可以通过其与插件交互的 UI 控件 表示 这些表面也是插件 每当添加新插件时 瘦主机都会自动确定哪个可用表面与其最匹配的 UI 如何在 C 中
  • OpenCV 2.4.3 中的阴影去除

    我正在使用 OpenCV 2 4 3 最新版本 使用内置的视频流检测前景GMG http docs opencv org modules gpu doc video html highlight gmg gpu 3a 3aGMG GPU算法
  • ASP.NET JQuery AJAX POST 返回数据,但在 401 响应内

    我的应用程序中有一个网页 需要调用我设置的 Web 服务来返回对象列表 这个调用是这样设置的 document ready function var response ajax type POST contentType applicati
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • 带有私有设置器的 EFCore Base 实体模型属性 - 迁移奇怪的行为

    实体模型继承的类内的私有设置器似乎会导致 EFCore 迁移出现奇怪的问题 考虑以下示例 其中有多个类 Bar and Baz 继承自Foo 跑步时Add Migration多次命令 添加 删除private修饰符 生成的模式在多个方面都是

随机推荐

  • 这行代码是做什么的? const uint32_t 好人 = 0x1 << 0

    有人可以告诉我这里正在做什么吗 const uint32 t goodguys 0x1 lt lt 0 我假设它是 c 并且它正在为一个组分配一个标签 但我从未见过这样做 我是一个自学的 Objective C 人 这对我来说看起来很陌生
  • 测试使用 jQuery 和 window 对象的 React 组件

    我的 React 组件必须响应resize事件 我使用 jQuery 即 componentDidMount function window on resize function 然而 这会导致我的 Jest 测试出现问题 具体来说 Typ
  • WooCommerce 使用 ajax 在结账页面上向购物车总计添加自定义费用

    我试图在用户更改送货地址选择下拉列表时使用 ajax 动态向购物车总计添加费用 我可以获取该值 但当选择另一个状态时 它不会更新总计 我的ajax请求 jQuery document ready function jQuery shippi
  • 我需要知道如何创建交叉表查询

    我想动态生成状态列 有三张表 资产 资产类型 资产状态 Table assets assetid int assettag varchar 25 assettype int assetstatus int Table assettypes
  • 在 IntelliJ Idea IDE 中禁用单击、拖动、剪切和粘贴

    在我的 IntelliJ Idea 13 1 2 IDE 中 我不断遇到通过笔记本电脑触摸板单击并拖动进行选择的情况 我总是不小心点击并拖动文本和剪切线 我在选项和设置面板中搜索了 单击和拖动 一词 但我没有找到关闭此功能的方法 Intel
  • Python dbfpy 和 FoxPro

    我在这里使用一种古老的数据库格式 dbf 文件 不要问为什么 只知道某个软件决定扩展foxpro支持 因为微软决定扩展foxpro支持 现在 我在特定文件上收到以下错误 我已成功加载另一个文件 我很好奇该数据库是否有问题 我确信您可能需要查
  • xlsxwriter set_column 隐藏不起作用

    我试图用 XlsxWriter 隐藏一个列 但它似乎不起作用 函数返回0表示该列已成功隐藏 我使用的是带有数字的列 而不是带有字母的列 workbook get worksheet by name SENSORS set column 5
  • 更改 Visual Studio 2005 中的应用程序图标?

    我想为我的游戏的演示版本使用不同的图标 并且我正在使用与完整版本不同的构建配置来构建演示 使用预处理器定义来锁定某些内容 使用不同的图形 有没有办法让 Visual Studio 在演示配置中为应用程序图标使用不同的图标 但继续为完整版本的
  • 更改 a:hover 上 li 的背景图像

    我有一个菜单 div div
  • Heroku 上的 Django 部署问题与正在运行的应用程序的精确克隆:PUSH REJECTED ERROR

    我在 Heroku 上有一个 Django 应用程序 我在同一个 Heroku 帐户上设置了另一个应用程序 现在我想要第一个应用程序的另一个实例 我刚刚克隆了第一个应用程序并推送到新创建的应用程序中 但它不起作用 做的时候出现这个错误git
  • 编译时 -pthread 标志的含义

    在各种多线程 C 和 C 项目中 我看到了 pthread标志应用于编译和链接阶段 而其他人根本不使用它 只是通过 lpthread到链接阶段 不编译链接有没有危险 pthread标志 即什么 pthread实际上呢 我主要对 Linux
  • npm 安装后如何引用 Google Material-Design-Icons?

    所以做完之后npm install material design icons 我如何在我的React应用 所包括的方法here https google github io material design icons icon font
  • Laravel - 缓存 Eloquent 并频繁更新

    是否可以对经常修改的对象使用缓存 例如 假设我们有一个 BlogPost 对象 并且有一个经常更改的 num of views 列 以及其他列 是否可以更新缓存和数据库中的 num of views 字段 而不破坏缓存对象并重新创建它 我可
  • 如何通过 UIAutomation 处理“_APPNAME_想使用您当前的位置”警报

    好吧 这让我抓狂 我正在运行一个小型 CI 构建系统 我正在使用 UIAutomation 对我的应用程序进行 UI 测试 由于应用程序使用 CoreLocation 因此第一次启动应用程序时 我会收到一条小警报 要求我确认是否希望跟踪我的
  • Swig (Node.js) 中的 JSON.parse() ?

    当我陷入困境时 我试图从 Jade 切换到 Swig 被 Swig 的疯狂性能所吸引 作为我的 Express 模板引擎 我将一系列序列化 JSON 从 Express 发送到 Swig 并使用此循环检索 Swig 中的数据这里 ul if
  • node.js fs.writeFile 未完全覆盖文件

    我有一个长度为 X 的文件 它正在被长度为 X Y 的字符串覆盖 问题是 该文件仍然保留 X Y 过去的信息 因此它与第一个较长的文件一样长 所以这是我的测试输出 它让我适合 文件开头为 sOption1 String nOption2 2
  • SQL 错误:ORA-00913:值太多

    两个表在表名 列名 数据类型和大小方面相同 这些表位于不同的数据库中 但我习惯于 当前登录 hr 用户 insert into abc employees select from employees where employee id 10
  • Stripe 结账模式的事件或方法

    有什么方法可以在 Stripe Checkout 模式关闭时触发事件吗 Stripe 的模式关闭和响应传递之间存在大约 0 5 1 秒的延迟 那时 用户可能会点击离开页面等 为了解决这个问题 我们可以执行一些操作 例如禁用所有链接或在页面上
  • 如何在现有 Windows 应用程序中获得 ATL 支持

    我正在 Visual Studio 2012 中使用 Qt 5 3 1 构建一个应用程序 我还想使用一个硬件库 这需要我向项目添加一个简单的 ATL 对象 这可以通过使用 Visual Studio 向导来完成 该向导抱怨我的项目既不是 M
  • 如何确定函数特化的主要模板?

    函数模板专业化的主要模板通常是非常直观的 但是 我正在寻找正式的规则来理解更令人惊讶的情况 例如 template