首页 > 编程语言 >第5章 函数返回类型后置(C++11)

第5章 函数返回类型后置(C++11)

时间:2024-09-01 23:47:21浏览次数:9  
标签:11 return 后置 int auto t2 C++ t1 decltype

第5章 函数返回类型后置(C++11)

5.1 使用函数返回类型后置声明函数

语法:auto是一个占位符,int才是真正的返回类型

auto foo()->int
{
  return 42;
}

返回一个函数指针类型,返回类型后置可能会是一个不错的选择

int bar_impl(int x)
{
  return x;
}

typedef int(*bar)(int);
bar foo1()
{
  return bar_impl;
}

auto foo2()->int(*)(int)
{
  return bar_impl;
}

int main() {
  auto func = foo2();
  func(58);
}

5.2 推导函数模板返回类型

template<class T1, class T2>
auto sum1(T1 t1, T2 t2)->decltype(t1 + t2)
{
  return t1 + t2;
}

int main() {
  auto x1 = sum1(4, 2);
}

可以将decltype放在前面,但是不能直接用,需要一些技巧。

(1)调用构造函数,获取返回类型推导

template<class T1, class T2>
decltype(T1() + T2()) sum2(T1 t1, T2 t2)
{
    return t1 + t2;
}

存在问题:若无参构造函数不存在,则无法通过编译。(decltype不实际计算表达式的值,但是会进行语法检查。)

(2)使用static_cast强转nullptr

template<class T1, class T2>
decltype(*static_cast<T1 *>(nullptr) + *static_cast<T2 *>(nullptr)) sum3(T1 t1, T2 t2)
{
    return t1 + t2;
}

由于不实际计算表达式的值,因此运行时不会出现内存错误。

(3)使用std::declval

template<class T1, class T2>
decltype(std::declval<T1>() + std::declval<T2>()) sum4(T1 t1, T2 t2)
{
    return t1 + t2;
}

或自己写一个模板函数,无需实现

template<class T>
T&& declval2();

template<class T1, class T2>
decltype(declval2<T1>() + declval2<T2>()) sum5(T1 t1, T2 t2)
{
    return t1 + t2;
}

标签:11,return,后置,int,auto,t2,C++,t1,decltype
From: https://www.cnblogs.com/Danieeel959/p/18391966

相关文章

  • 第4章 decltype说明符(C++11~C++17)
    第4章decltype说明符(C++11~C++17)4.1回顾typeof和typeid(1)在C++11标准发布以前,GCC的扩展提供了一个名为typeof的运算符。通过该运算符可以获取操作数的具体类型。typeof是GCC所提供,并非C++标准。inta=9;typeof(a)b=5;(2)C++标准还提供了一个typeid运算符来获取与目标操......
  • Openshift 3.11单机版 离线安装
    Openshift3.11单机版离线安装‍前置条件虚拟机:建议系统内存>=6G,CPU>=4。镜像仓库:在虚拟机上能够访问到该镜像仓库,如果没有,推荐使用harbor自建。docker:虚拟机上需要安装docker,这里使用的是18.09版本。离线安装可参考docker离线安装或自行下载rpm包安装。‍安装步骤......
  • springboot原创歌曲分享平台(11066)
     有需要的同学,源代码和配套文档领取,加文章最下方的名片哦一、项目演示项目演示视频二、资料介绍完整源代码(前后端源代码+SQL脚本)配套文档(LW+PPT+开题报告)远程调试控屏包运行三、技术介绍Java语言SSM框架SpringBoot框架Vue框架JSP页面Mysql数据库IDEA/Eclipse开发四、项......
  • springboot招生管理系统(11071)
     有需要的同学,源代码和配套文档领取,加文章最下方的名片哦一、项目演示项目演示视频二、资料介绍完整源代码(前后端源代码+SQL脚本)配套文档(LW+PPT+开题报告)远程调试控屏包运行三、技术介绍Java语言SSM框架SpringBoot框架Vue框架JSP页面Mysql数据库IDEA/Eclipse开发四、项......
  • 中国各地区数字经济发展对环境污染的影响数据(2011-2021年)
    关于中国各地区数字经济发展对环境污染的影响数据(2011-2021年),可以从以下几个方面获取相关信息:数字经济水平:可以通过熵值法衡量的数字经济水平指标来评估各地区的数字经济发展情况。环境污染物排放量:包括PM2.5均值、工业烟粉尘排放量、工业二氧化硫排放量和工业废水排放量等......
  • 深入理解C++中的同步并发操作(c++ concurrency in action 第四章总结)
    深入理解C++中的同步并发操作(c++concurrencyinaction第四章总结)第四章详细介绍了C++中的各种并发工具,包括条件变量、std::future和std::async、带超时的wait、std::packaged_task和std::promise,以及如何使用这些工具来简化代码。本总结将依次介绍这些工具的用法......
  • 深入理解C++中的const:函数参数与成员函数的最佳实践
    const关键字在C++中有多种用途,它的主要作用是定义不可修改的变量或数据,使得代码更加安全和清晰。具体使用场景包括:定义常量变量:使用const定义的变量在初始化后不能被修改。这样可以防止代码中对该变量的意外修改。constintmax_value=100;max_value=200;//错误:尝试......
  • 深度解析:引用 vs 指针,C++程序员必须掌握的核心概念
    引用(Reference)和指针(Pointer)都是C++中非常重要的概念,它们都用于间接访问变量或对象,但在使用方式、语法、内存管理等方面存在显著区别。下面详细解释什么是引用,并展开讨论它与指针的区别。一、什么是引用?引用(Reference)是C++中的一种变量类型,它是已存在变量的一个别名。引用本......
  • C++菜鸟教程 - 从入门到精通 第一节
    一.C++简介C++是一种编程语言,它是由BjarneStroustrup于1979年在贝尔实验室开始设计开发的。C++进一步扩充和完善了C语言,是一种面向对象的程序设计语言。C++可运行于多种平台上,如Windows、MAC操作系统以及 UNIX的各种版本。C++是一种静态类型的、编译式的、......
  • C++头文件<algorithm>中常用函数简介
     概述头文件algorithm(算法库)中主要提供了一些对容器操作的函数,如排序、搜索、复制、比较等,因此使用频率还是很高的,由于主要是操作容器,所以函数的语法也很类似:algorithm_name(container.begin(),container.end(),...);其中,container.begin()和container.end()分......