广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++返回值类型后置实现(跟踪返回值类型)
  • 495
分享到

C++返回值类型后置实现(跟踪返回值类型)

2024-04-02 19:04:59 495人浏览 薄情痞子
摘要

在泛型编程中,可能需要通过参数的运算来得到返回值的类型。考虑下面这个场景: template <typename R, typename T, typename U>

在泛型编程中,可能需要通过参数的运算来得到返回值的类型。考虑下面这个场景:


template <typename R, typename T, typename U>
R add(T t, U u)
{
    return t+u;
}
int a = 1; float b = 2.0;
auto c = add<decltype(a + b)>(a, b);

我们并不关心 a+b 的类型是什么,因此,只需要通过 decltype(a+b) 直接得到返回值类型即可。但是像上面这样使用十分不方便,因为外部其实并不知道参数之间应该如何运算,只有 add 函数才知道返回值应当如何推导。

那么,在 add 函数的定义上能不能直接通过 decltype 拿到返回值呢?
template <typename T, typename U>
decltype(t + u) add(T t, U u)  // error: t、u尚未定义
{
    return t + u;
}
当然,直接像上面这样写是编译不过的。因为 t、u 在参数列表中,而 c++ 的返回值是前置语法,在返回值定义的时候参数变量还不存在。

可行的写法如下:


template <typename T, typename U>
decltype(T() + U()) add(T t, U u)
{
    return t + u;
}

考虑到 T、U 可能是没有无参构造函数的类,正确的写法应该是这样:


template <typename T, typename U>
decltype((*(T*)0) + (*(U*)0)) add(T t, U u)
{
    return t + u;
}

虽然成功地使用 decltype 完成了返回值的推导,但写法过于晦涩,会大大增加 decltype 在返回值类型推导上的使用难度并降低代码的可读性。

因此,在 C++11 中增加了返回类型后置(trailing-return-type,又称跟踪返回类型)语法,将 decltype 和 auto 结合起来完成返回值类型的推导。

返回类型后置语法是通过 auto 和 decltype 结合起来使用的。上面的 add 函数,使用新的语法可以写成:


template <typename T, typename U>
auto add(T t, U u) -> decltype(t + u)
{
    return t + u;
}

为了进一步说明这个语法,再看另一个例子:


int& foo(int& i);
float foo(float& f);
template <typename T>
auto func(T& val) -> decltype(foo(val))
{
    return foo(val);
}

如果说前一个例子中的 add 使用 C++98/03 的返回值写法还勉强可以完成,那么这个例子对于 C++ 而言就是不可能完成的任务了。

在这个例子中,使用 decltype 结合返回值后置语法很容易推导出了 foo(val) 可能出现的返回值类型,并将其用到了 func 上。

返回值类型后置语法,是为了解决函数返回值类型依赖于参数而导致难以确定返回值类型的问题。有了这种语法以后,对返回值类型的推导就可以用清晰的方式(直接通过参数做运算)描述出来,而不需要像 C++98/03 那样使用晦涩难懂的写法。

到此这篇关于C++返回值类型后置实现(跟踪返回值类型)的文章就介绍到这了,更多相关C++返回值类型后置实现(跟踪返回值类型)内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++返回值类型后置实现(跟踪返回值类型)

本文链接: https://www.lsjlt.com/news/132880.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++返回值类型后置实现(跟踪返回值类型)
    在泛型编程中,可能需要通过参数的运算来得到返回值的类型。考虑下面这个场景: template <typename R, typename T, typename U>...
    99+
    2022-11-12
  • C++中Covariant返回值类型详解
    目录前言什么是协变返回值类型(Covariant)协变返回值类型(Covariant)的作用前言 C++中当子类覆写(override)父类虚函数时,子类函数的返回值类型可以和父类函...
    99+
    2022-11-13
  • PHP函数的返回值类型和返回值说明
    PHP是一种类型松散的编程语言,这意味着它允许开发人员在运行时更轻松地修改变量类型。但是,在编写函数时,开发人员必须清楚函数的返回类型和返回值说明,以确保函数将返回正确的数据类型和结构。PHP函数的返回值类型在5.0版本之前,PHP函数无法...
    99+
    2023-05-18
    PHP函数 返回值类型 返回值说明
  • java中的方法返回值使用泛型,实现灵活的返回值类型
      使用Mybatis框架的时候,想封装一个底层JDBC控制器,用于提供和Mybatis交互的增删改查接口(公用的接口),但由于公用的查询方法可能是用户自定义的任意一个和表对应的java bean类型,所以要考虑怎么样给调用者返回正确的返回...
    99+
    2023-09-02
    mybatis java spring
  • MybatisSelectCount(*)的返回值类型介绍
    目录Select Count(*)的返回值类型返回Count(*)的整数值Select Count(*)的返回值类型 <select id="queryAlarm...
    99+
    2022-11-12
  • Ajax的返回值类型是什么
    这期内容当中小编将会给大家带来有关Ajax的返回值类型是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、返回值之XML类型如果服务器的响应头中Content-type的内容为text/xml时,此时...
    99+
    2023-06-08
  • mysqli_query($conn, $sql)函数的返回值类型
    本篇文章给大家分享的是有关mysqli_query($conn, $sql)函数的返回值类型,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、...
    99+
    2022-10-18
  • 怎么理解C++11的返回类型后置
    这篇文章主要介绍“怎么理解C++11的返回类型后置”,在日常操作中,相信很多人在怎么理解C++11的返回类型后置问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解C++11的返回类型后置”的疑惑有所帮助!...
    99+
    2023-06-19
  • typescript返回值类型和参数类型的具体使用
    目录返回值类型可缺省和可推断的返回值类型Generator 函数的返回值参数类型可选参数和默认参数剩余参数返回值类型 在 JavaScript 中,我们知道一个函数可以没有显式 re...
    99+
    2022-11-13
  • Mybatis Select Count(*)的返回值类型是什么
    本篇内容介绍了“Mybatis Select Count(*)的返回值类型是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读...
    99+
    2023-06-22
  • python中函数的返回值及类型详解
    目录1.返回值介绍2.带有返回值的函数3.保存函数的返回值4.四种函数的类型1.无参数,无返回值的函数2.无参数,有返回值的函数3.有参数,无返回值的函数4.有参数,有返回值的函数5...
    99+
    2023-05-14
    python函数返回值 python 返回值类型
  • Python函数常见几种return返回值类型
    Python函数常见return返回值类型Python函数return返回值类型主要包括: class 'int', class 'str', cla...
    99+
    2023-01-06
    Python return返回值 Python return
  • Go语言-为什么返回值为接口类型,却返回结构体
    最近由于项目需求,阅读一些Go语言编写的项目的源代码,在某一个函数中发现了一个奇怪的现象:一个函数的返回值类型声明的是一个接口的类型,但是实际在函数体内返回的却是一个结构体类型...
    99+
    2022-06-07
    GO 结构体 返回值 go语言 接口
  • SQL Server 2019中Function默认返回值会影响Function创建时规定的返回值类型
    项目里客户端突然报错,原因是SQL Server中某个Function返回值有问题,拿来代码看还是比较简单的Function,虽然写法很不好,但是select dbo.fn_xxxfunction(0)返回值是空就有点奇怪。 IF...
    99+
    2017-06-05
    SQL Server 2019中Function默认返回值会影响Function创建时规定的返回值类型
  • C++11如何引入的尾置返回类型
    目录一、什么是尾置返回类型(trailing return type)二、尾置返回的典型场景2.1 常规方式如何返回数组指针2.2 使用尾置返回类型三、尾置返回类型的应用四、总结一、...
    99+
    2023-01-10
    C++11尾置返回类型 C++11返回类型
  • 在SpringMVC中使用 Controller 如何实现返回可选类型的值
    本篇文章为大家展示了在SpringMVC中使用 Controller 如何实现返回可选类型的值,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。spring mvc 支持如下的返回方式:ModelAnd...
    99+
    2023-05-31
    springmvc 的值 controller
  • C++11模板函数与返回类型后置举例分析
    这篇文章主要介绍“C++11模板函数与返回类型后置举例分析”,在日常操作中,相信很多人在C++11模板函数与返回类型后置举例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++11模板函数与返回类型后置举...
    99+
    2023-06-19
  • SpringMVC修改返回值类型后的消息转换器处理方式
    目录问题案例为什么?了解问题原因及分析解决方法结语o(╯□╰)o这标题看起来有点奇怪,所以先以一个小小的案例来说明一下本文要描述和解决的问题 问题案例 假设有一个Controller...
    99+
    2022-11-12
  • python中函数的返回值及类型实例代码分析
    这篇“python中函数的返回值及类型实例代码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“python中函数的返回值及...
    99+
    2023-07-05
  • mybatis返回map类型数据空值字段不显示怎么办
    这篇文章主要为大家展示了“mybatis返回map类型数据空值字段不显示怎么办”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mybatis返回map类型数据空值字段不显示怎么办”这篇文章吧。my...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作