40 CPP函数模板高级

news2025/1/31 18:45:01
#include "iostream"
using namespace std;
template <typename T1, typename T2>
void func(T1 a, T2 b)
{
    //其它代码

    ??? tmp = a + b; //返回值该用什么呢?

    //其它代码
}
void test()
{
}
int main()
{
    test();
    return 0;
}

1 decltype关键字

在C++中,decltype操作符,用于查询表达式的数据类型。

语法:decltype(expression) var;

decltype分析表达式并得到它的类型,不会计算执行表达式。函数调用也是一种表达式,因此不必担心在使用decltype时执行函数。

decltype推导规则(按步骤):

1 如果expression是一个没有用括号括起来的标识符,则 var 的类型与该标识符的类型相同,包括const等限定符。

2 如果expression是一个函数调用,则var的类型与函数的返回值类型相同(函数不能 返回void,但是可以返回void *)

3 如果expression是一个左值(能取地址)(要排除第一种情况)、或者用括号括起来的标识符,那么var的类型时expression的引用。

4 如果上面的条件都不满足,则var的类型与expression的类型相同。

如果需要多次使用decltype,可以结合typedef和using。(可以给推导出来的数据类型起别名)

总的来说:decltype的结果要么和表达式的类型相同,要么就是表达式的类型的引用,只有这两种情况,记住这一点就行。

decltype和auto都可以推导表达式的数据类型,但是它们本质上有区别,

 这种语法也可以用于函数定义:

auto func(int x, double y) -> int
{
    cout << "函数体" << endl;
}
#include "iostream"
using namespace std;

int func()
{
    cout << "调用了func函数" << endl;
    return 11;
}
auto func2(int x, double y) -> int
{
    cout << "函数体" << endl;
    return 1;
}
void test()
{
    // short b = 5;
    // short *a = &b;
    // decltype(a) da;

    // short a = 5;
    // short &ra = a;
    // short b = 10;
    // decltype(ra) da = b;

    short b = 10;
    decltype(func()) da = b; //不会调用函数
    //上面填函数调用和函数名是两回事,如果只填函数名,得到的是函数的类型,不是函数返回值的类型. 如下
    decltype(func) *da2 = func;
    da2();

    // decltype(func()) f; //本质区别,不会调用func
    auto f = func(); //本质区别,会调用func,且用auto的时候需要初始值,要不然没东西可以推导
}
// template <typename T1, typename T2>
// void func3(T1 a, T2 b)
// {
//     //其它代码

//     // ? ? ? tmp = a + b; //返回值该用什么呢?

//     //其它代码
// }

template <typename T1, typename T2>
auto func3(T1 a, T2 b) -> decltype(a + b)
{
    decltype(a + b) tmp = a + b;
    return tmp;
}

int main()
{
    test();
    auto ret = func3(1, 3.3);
    cout << "ret=" << ret << endl;
    return 0;
}

C++14的auto关键字

C++14标准对函数返回类型推导规则做了优化,函数的返回值可以auto,不必尾随返回类型

#include "iostream"
using namespace std;

template <typename T1, typename T2>
auto func3(T1 a, T2 b)
{
    decltype(a + b) tmp = a + b;
    return tmp;
}

int main()
{
    auto ret = func3(1, 3.3);
    cout << "ret=" << ret << endl;
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/104685.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工控CTF之协议分析1——Modbus

协议分析 流量分析 主要以工控流量和恶意流量为主&#xff0c;难度较低的题目主要考察Wireshark使用和找规律&#xff0c;难度较高的题目主要考察协议定义和特征 简单只能简单得干篇一律&#xff0c;难可以难得五花八门 常见的工控协议有&#xff1a;Modbus、MMS、IEC60870、…

猿如意中的【Parrot-树莓派-5.0 arm64位 】工具框架的介绍详情

目录 一、工具名称 二、下载安装渠道 2.1 什么是猿如意&#xff1f; 2.2 如何下载猿如意&#xff1f; 三、工具介绍 四、Parrot-树莓派-5.0 arm64位功能介绍 五、软件安装过程 5.1 如何在猿如意中下载开发框架Parrot-树莓派-5.0 arm64位&#xff1f; 5.2 下载完成的Pa…

JMeter中如何简单地使用cookie

JMeter是一个集接口调试和性能测试于一体的测试工具&#xff0c;是很多技术型测试人员的必备工具&#xff0c;下面介绍一个如何简单地在JMeter中使用cookie登录一个网站并进行简单断言&#xff0c;拿广大测试人员最熟悉的51testing论坛来举例~ 一、收集登录数据 1.用Chrome打…

真正“自学”入门编程/程序员是一种怎样的体验

当年没考上大学&#xff0c;读了自考。 从那以后就开始了自学生涯&#xff0c;第一年还乖乖的去听课&#xff0c;第二年就完全放弃课堂了。 后来考本&#xff0c;读研&#xff0c;中间穿插学点通信&#xff0c;画图什么的&#xff0c;全部自己来。 仔细想想&#xff0c;读研…

我转行前端花了11个月

当你看到这行文字时&#xff0c;我假设你是一个准备转行前端&#xff0c;或者正在转行前端的人。我刚花了11个月转行前端。和你聊聊我的故事吧。 转行花了多久&#xff1f;11个月 准备转行前端时&#xff0c;我看了很多过来人写的转行经验。别人什么条件&#xff0c;转行花了…

SpringBoot3.0整合chatGPT

导读 导读 | 12月总体来说互联网的技术圈是非常热闹的&#xff0c;chatGPT爆火&#xff0c;SpringBoot3.0发布等重磅陆消息续进入大家的视线&#xff0c;而本文作者将以技术整合的角度&#xff0c;带大家把最火的两个技术整合在一起。读完本文&#xff0c;你将熟悉SpringBoot3…

(2022年12月最新)SpringBoot远程代码执行whitelabel error page SpEL RCE漏洞复现

1、 漏洞原理 spring boot 处理参数值出错&#xff0c;流程进入org.springframework.util.PropertyPlaceholderHelper 类中 此时 URL 中的参数值会用 parseStringValue 方法进行递归解析。其中 ${} 包围的内容都会被org.springframework.boot.autoconfigure.web.ErrorMvcAutoC…

电机分类和原理

一&#xff1a;核心原理 电生磁。 电机&#xff08;英文&#xff1a;Electric machinery&#xff0c;俗称“马达”&#xff09;是指依据电磁感应定律实现电能转换或传递的一种电磁装置。分为电动机&#xff08;符号为M&#xff09;和发电机&#xff08;符号为G&#xff09;。…

如何做好预算管理?预算上接战略,下接绩效,如何形成战略-计划-预算-绩效的闭环?

如何做好预算管理&#xff1f; 以前觉得经营是对净利润负责&#xff0c;年底有钱赚就可以&#xff0c;从未考虑过如何才能赚更多的钱&#xff0c;也未考虑过经营是对股东负责。 现在觉得经营的门道确实很大&#xff0c;以前看的面窄&#xff0c;并没有真正理解预算的意义&…

WPF中如何实现页面的切换

总目录 文章目录总目录前言一、准备工作1.搭建一个简单的mvvm项目结构二、实现1.使用Frame控件的方式实现2.使用反射的方式实现3.实现效果总结前言 本文主要讲述如何在同一个窗体内&#xff0c;实现不同功能模块的页面切换。 一、准备工作 1.搭建一个简单的mvvm项目结构 首先…

『纯canvas实现』你可能想象不到,粒子效果配合时钟还能这么玩?

前言 大家好&#xff0c;我们知道一般学习 canvas 时&#xff0c;做的最多的莫过于各种时钟&#xff0c;像下面这样的&#xff1a; 亦或是这样的&#xff1a; 或是这样的&#xff1a; 上面给大家展示了三种风格各异的时钟效果&#xff0c;但都没有让人眼前一亮的感觉&#xff…

一颗红心,三手准备,分别基于图片(img)/SCSS(样式)/SVG动画实现动态拉轰的点赞按钮特效

华丽炫酷的动画特效总能够让人心旷神怡&#xff0c;不能自已。艳羡之余&#xff0c;如果还能够探究其华丽外表下的实现逻辑&#xff0c;那就是百尺竿头&#xff0c;更上一步了。本次我们使用图片、SCSS样式以及SVG图片动画来实现“点赞”按钮的动画特效&#xff0c;并比较不同之…

CLM陆面过程模式

NCAR陆面模式CLM (Community Land Model)是地球系统模式CESM (Community Earth System Model)中的陆面过程模式分量&#xff0c;是在结合了BATS、LSM和IAP94等众多陆面模式的优点后&#xff0c;加入水文过程而开发出的综合性陆面模式&#xff0c;是目前国际上发展最为完善且得到…

java实现每日给女友微信发送早安等微信信息

大家好&#xff0c;我是雄雄。 前言 据说这个功能最近在抖音上很火&#xff0c;我没有抖音&#xff0c;没有看到。 但是我在掘金和CSDN上看了&#xff0c;相关案例确实很多&#xff0c;但是大家都是借助于了微信服务号&#xff0c;在我看来&#xff0c;效果很不佳。 其实我原…

如何在 Ubuntu 上将 ONLYOFFICE 文档集成至 Redmine

ONLYOFFICE 文档是一款符合 GNU AGPL v3.0 的开源办公套件。其中包含基于 Web 的查看器和协作编辑器&#xff0c;可用于处理文本文档、电子表格以及与 OOXML 格式高度兼容的演示文稿。 ONLYOFFICE 文档可与 Nextcloud、ownCloud、Seafile、Alfresco、Plone 等多种云服务进行集…

RabbitMQ(消息中间件)入门

目录 一. 什么是MQ&#xff1f; 二. 应用场景 三. 主流MQ框架 四. Docker安装部署RabbitMQ 1.查询镜像 2.获取镜像 3.运行镜像 四.进入RabbitMQ管理平台进行相关操作 五. RabbitMQ管理平台 1.Virtual Hosts 2.RabbitMQ关键名词 六. MQ的核心概念 七. springboot整合ra…

BiliBili 100+国际名校免费公开课整理分享

本资源这是一份公开课的目录&#xff0c;这里的视频大多来自 YouTube 等国内无法访问的网站&#xff0c;为了方便国内的朋友观看&#xff0c;作者将这些视频搬运到了BiliBili。 资源整理自网络&#xff0c;源地址&#xff1a;https://github.com/wenhan-wu/OpenCourseCatalog 所…

我今年大一,自学编程可行吗?

自学编程是可行的&#xff0c;但是你行不行就不好说了。 可能&#xff0c;这就是人生吧~ 建议你在自学编程之前&#xff0c;先看一下这几个问题&#xff1a; 1、我是一个意志坚定&#xff0c;抗压能力强&#xff0c;能耐得住寂寞的人吗&#xff1f;2、我对学编程是有规划还是只…

君子不玩物丧志,亦常以借物调心,网站集成二次元网页小组件(widget)石蒜模拟器,聊以赏玩

传世经典《菜根谭》中有言曰&#xff1a;“徜徉于山林泉石之间&#xff0c;而尘心渐息&#xff1b;夷犹于诗书图画之内&#xff0c;而俗气潜消。故君子虽不玩物丧志&#xff0c;亦常借物调心。”意思是&#xff0c;徜徉在林泉山石之间&#xff0c;能够摒弃杂念&#xff0c;留意…

C++程序设计——运算符重载(运算符重载的概念;运算符成员函数与友元函数;单目运算符重载;重载流运算符;双目运算符重载;赋值运算符重载)

目录 前言 一、运算符重的概念与意义 1.运算符重载 &#xff08;1&#xff09;函数重载 &#xff08;2&#xff09;运算符重载 2.运算符重载的意义 &#xff08;1&#xff09;例子引入 &#xff08;2&#xff09;意义 &#xff08;3&#xff09;运算符重载的限制 …