为什么模板参数不推导只作为返回类型?

2023-11-28

如果我不在函数参数列表中使用模板参数(类型)->仅作为返回类型,则不会有任何推论:

template <typename T>
T zero() { return 0; }

int main()
{
    int x = zero();
}

gives:

a.cpp:15:18: error: no matching function for call to ‘zero()’
     int x = zero();
                  ^
a.cpp:11:3: note: candidate: ‘template<class T> T zero()’
 T zero() { return 0; }
   ^~~~
a.cpp:11:3: note:   template argument deduction/substitution failed:
a.cpp:15:18: note:   couldn't deduce template parameter ‘T’
     int x = zero();

编译的唯一方法是在尖括号中指定模板类型:

template <typename T>
T zero() { return 0; }

int main()
{
    int x = zero<int>();
}
  1. 所以我的问题是,为什么 g++can从中推导出类型参数列表模板函数,但是cannot从中推断出返回类型(编译器编译时也知道main,所以它知道类型)。

  2. 当模板函数在其参数列表中使用模板类型时,为模板函数提供尖括号中的类型是任意的(因为推导)?因此,作为一个好的实践,我是否应该始终在大括号中提供类型,无论函数如何声明?

第二个问题不太可读。用简单的话来说 -> 我应该使用foo<T>(arg, ...)(提供类型)每次,无论函数声明如何?即使编译器可以推断出它,但我还是会提供类型以进行良好的实践?


一般来说,不可能根据函数的返回类型来推断函数。但是如果您使用自动类型转换 C++ 功能,那么您可以实现您所需要的:

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

template <>
float zero<float>() { return 3.0f; }

struct Zero
{
    template<typename T>
    operator T()
    {
        return zero<T>();
    }
};

int main()
{
    int x = Zero();
    float y = Zero();
    return x + y;
}

首先创建临时对象 Zero(),在分配期间我们使用转换运算符来执行零模板函数的正确特化。

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

为什么模板参数不推导只作为返回类型? 的相关文章

随机推荐

  • 如何从本地网络上的另一台机器访问docker容器

    我正在使用 Docker for Windows 我没有使用使用虚拟机的 Docker Toolbox 但我无法从本地网络上的另一台计算机看到我的容器 在我的主机中 一切都很完美并且运行良好 但是 我希望其他人使用我的容器 尽管发布了Doc
  • 非临时指令如何工作?

    我正在阅读每个程序员都应该了解的内存知识乌尔里希 德雷珀 Ulrich Drepper pdf在第 6 部分的开头有一个代码片段 include
  • Javascript ES6 共享类变量

    我有一堂课 看起来像这样 class Foo constructor arg1 arg2 this some obj new SomeObj param1 arg1 param2 arg2 module exports Foo 现在我想做同
  • Bootstrap Glyphicons datetimepicker 更改图标

    我正在使用 Bootstrap 日期时间选择器https eonasdan github io bootstrap datetimepicker 正如文档中提到的 我成功地使用下面的代码更改了向上 向下箭头 datetimepicker7
  • 如何配置 Pex 以尊重代码契约?

    鉴于以下示例代码 我如何配置 Pex 以遵守我的代码契约 public static IEnumerable
  • Elasticsearch 数组属性必须包含给定的数组项

    我的文件看起来像 tags gt tag1 tag2 name gt Example 1 tags gt tag1 tag3 tag4 name gt Example 2 我现在想要的是进行术语搜索 其中给定的数组可能如下所示 tag1 t
  • Google Play 应用程序页面的 Google Analytics(分析)

    我想分析人们使用哪些搜索关键字在 Play 商店中查找我的应用 那可能吗 我怎样才能这样做呢 自 2013 年 10 月起 您可以将 Google Analytics 和 Google Play 帐户关联起来 以查看应用程序页面的浏览量以及
  • RGB 值到 HSL 转换器

    Google 地图 API v3 允许将 样式 应用于地图 包括设置各种要素的颜色 然而 它使用的颜色格式是 HSL 或者看起来像这样 色调 RGB 十六进制字符串 亮度 100 到 100 之间的浮点值 饱和度 100 到 100 之间的
  • MEDIA_TYPE_IMAGE 无法识别

    我在使用 Android 开发人员的相机资源时遇到问题 这是我的代码 create Intent to take a picture and return control to the calling application Intent
  • 填写 jasper 报告时的进展

    我想在 Jasper 报告填写编译报告时向用户提供进度 基本上我希望在执行时取得进展 JasperFillManager fillReport JasperReport rpt 地图参数 JRDataSource src 有办法实现这个目标
  • 比较 XML 忽略元素顺序

    使用 XMLUnit 2 如何在不考虑元素顺序的情况下比较两个文档 I got XMLUnit 1 的这个问题 但显然 v2 中的新 API 不再有提到的方法了 这是我当前的代码 Diff diff DiffBuilder compare
  • aks 报告“pod 不足”

    我已经完成了 Azure Cats Dogs 教程中描述的内容here我在 AKS 中启动应用程序的最后一步中遇到错误 Kubernetes 报告我的 Pod 不足 但我不确定为什么会出现这种情况 几周前我已经完成了相同的教程 没有出现任何
  • Firefox、IE9+ 在 td 内出现 div 高度 100% 的问题(Chrome 上的工作示例)

    拿着它 http jsfiddle net zVscL 4 edit me height 100 does not behave the same as Chrome width 10px border 1px solid blue bac
  • 如何使用 git 正确处理 GreaseMonkey 用户脚本?

    我正在为 Firefox 编写用户脚本 所以我使用油猴 另外 为了方便开发 我使用git更新我的代码的不同版本 现在 让我尝试解释一下这个问题 当我将本地 git 目录中的用户脚本添加到 GreaseMonkey 时 就会在 Firefox
  • Rails .where 与 .find

    我注意到Model where即使只有一个结果 方法也始终返回一个数组Model find方法没有 这有什么原因吗 我想Model where是自 Rails 3 X 以来的首选函数 我应该使用Model find当我期望一个结果并且Mod
  • 为什么 JavaScript 中的 new Number(2) != new String("2")

    以下评价为true new Number 2 2 new String 2 2 显然 但请执行以下操作 2 2 new Number 2 2 new String 2 2 那么有人可以清楚地解释为什么他下面的评价false new Numb
  • 我可以将层归一化与 CNN 结合使用吗?

    我发现层归一化是比批量归一化更现代的归一化方法 并且在 Tensorflow 中编码非常简单 但我认为层归一化是为 RNN 设计的 批量归一化是为 CNN 设计的 我可以使用 CNN 的层归一化来处理图像分类任务吗 选择批量归一化或层的标准
  • 从列表中删除项目[重复]

    这个问题在这里已经有答案了 在循环列表时 我想根据条件删除列表中的项目 请参阅下面的代码 这给了我一个ConcurrentModification例外 for Object a list if a getXXX equalsIgnoreCa
  • 将 IConfigurationRoot 部分的更改保存到 .net Core 2.2 中的 *.json 文件

    我正在挖掘寻找解决方案 但没有找到它 我敢打赌有人遇到过这个问题 那么问题是什么 为了测试 我创建了简单的控制台应用程序 解决方案将在 asp net core web api 中使用 我有 TestSetting json 配置文件 设置
  • 为什么模板参数不推导只作为返回类型?

    如果我不在函数参数列表中使用模板参数 类型 gt 仅作为返回类型 则不会有任何推论 template