首页 > 编程语言 >c++类型推导

c++类型推导

时间:2023-04-03 19:57:24浏览次数:40  
标签:std ... decltype 推导 auto c++ 类型

传统c和c++中,无论什么变量都应该先去声明其类型,指出其类型后才能进行下一步操作,这通常会花费很多无意义的时间。

c++11引入了auto 和 decltype 这两个关键字实现了类型推导,让编译器来操心变量的类型。这使得 C++ 也具有了和其他现代编程语言一样,某种意义上提供了无需操心变量类型的使用习惯。

auto

auto关键字可以对一些变量进行类型推导,简单使用样例如下:

int a=10;
auto b=a;

我们经常在对迭代器或循环中的变量声明中使用它,如

set<int> a;
... for(auto it = a.begin();it != a.end();++it){...} vector<int>b; ... for(auto num:b){...}

decltype

decltype关键字可以对一些表达式类型进行推导,例如:

auto x=1;    //x被推导为int
auto y=2;
decltype(x+y) z;    //z被推导为int
if (std::is_same<decltype(x), int>::value)
    std::cout << "type x == int" << std::endl;    //对x的类型进行判断

尾返回类型推导

c++11支持对函数返回类型进行推导,方法如下所示:

template<typename T, typename U>
auto add2(T x, U y) -> decltype(x+y){
    return x + y;
}

我们甚至可以配合std::future访问异步操作结果来实现对函数类型的推导(线程池中常见):

template <typename F, typename... Args>
    auto submit(F&& f, Args&&... args) -> std::future<decltype(std::forward<F>(f)(std::forward<Args>(args)...))>
    {
        using return_type = decltype(f(args...));
        auto task_ptr = std::make_shared<std::packaged_task<return_type()>>(std::bind(std::forward<F>(f), std::forward<Args>(args)...));
        auto task_future = task_ptr->get_future();
        auto wrapper_func = [task_ptr]() { (*task_ptr)(); };
        schedule_by_id(std::move(wrapper_func));
        return task_future;
    }

注意上述函数返回的是一个std::future对象即期约对象,对返回对象使用get方法即可获取函数 f 即decltype(std::forward<F>(f)(std::forward<Args>(args)...))类型的结果。

标签:std,...,decltype,推导,auto,c++,类型
From: https://www.cnblogs.com/Explosion556/p/17284161.html

相关文章

  • c++运行时间记录
    chrono::steady_clock::time_pointt1=chrono::steady_clock::now();......chrono::steady_clock::time_pointt2=chrono::steady_clock::now();chrono::duration<double>time_used=chrono::duration_cast<chrono::duration<double>>(t2-t1);......
  • PL/SQL 基础---复杂数据类型和自定义类型
    原文地址:https://blog.csdn.net/villare/article/details/53437924PL/SQL基础—复杂数据类型和自定义类型PLSQL中常用的自定义类型就两种:记录类型、PLSQL内存表类型(根据表中的数据字段的简单和复杂程度又可分别实现类似于简单数组和记录数组的功能)除此之外,还有大对象类型:CLOB......
  • 《c++徒步》基础语法篇
    trycatch原文链接:https://www.dotcpp.com/course/84语法结构:try{ //正常程序执行语句 throw(异常类型表达式);}catch(异常类型1){ //异常处理代码}catch(异常类型2){ //异常处理代码}catch(异常类型3){ //异常处理代码}//后续代码实例:#include<iostream......
  • linux下的c++filt 命令查找未定义符号的函数名
    我们知道,在C++中,是允许函数重载的,也就引出了编译器的namemangling机制,今天我们要介绍的c++filt命令便与此有关。   对于从事linux开发的人来说,不可不知道c++filt命令的使用。    在linux开发中,如果要调用基础模块库,就要包含对应的头文件,并在makefile中指......
  • C++17:新特性之std::optional
    考虑一个问题,C++如何实现返回多个值?如何标记其中一个bool返回值用于记录函数运行状态?我们可以通过pair或tuple实现,有以下代码:#include<iostream>#include<string>usingnamespacestd;structss{ strings; intsize;};pair<bool,ss>func2(conststring&in){......
  • C++黑马程序员——P55. 函数的分文件编写
    函数分文件编写一般有4个步骤1.创建后缀名为.h的头文件2.创建后缀名为.cpp的源文件3.在头文件中写函数的声明4.在源文件中写函数的定义 1.创建后缀名为.h的头文件右键项目的“头文件”文件夹->添加->新建项->然后中间选“头文件(.h)”,下面起个名字,添加2.......
  • 030 高阶导数求导之推导归纳法、公式法
    030高阶导数求导之推导归纳法、公式法......
  • TypeScript 学习笔记 — 基于对象操作的内置类型的使用(十二)
    目录1.Partial转化可选属性(?)2.Required转化必填属性(-?)3.Readonly转化仅读属性(readonly)Mutate(非内置,与Readonly相对)(-readonly)4.Pick挑选所需的属性5.Omit忽略属性在前几章的笔记中,了解了以下几种内置类型:条件类型相关:Exclude排除类型(差集),Extract抽取......
  • vsc debug C++
    mac{"version":"0.2.0","configurations":[{"name":"(lldb)Launch","type":"cppdbg","request":"launch","program":......
  • C++:实现RAII机制
    RAII,也称资源获取即初始化,要求资源的有效期与持有资源的对象的生命期严格绑定,不会出现内存泄漏等问题。我们尝试将指针封装到RAII类中,实现自动析构。#include<iostream>usingnamespacestd;template<typenameT>classRAII{public: RAII():data(nullptr){} explic......