首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏linjinhe的专栏

    现代 C++自动类型推导

    自动类型推导 现代的编程语言,不管是动态语言(JavaScript、Python 等),还是静态语言(Go、Rust 等),大都支持自动类型推导(type deduction)。 自动类型推导,通俗地讲就是定义一个变量的时候不需要明确指定类型,而是让编译器根据上下文进行推导。 在 C++11 之前,模板(template)代码就支持编译器自动类型推导。 C++11 很重要的一个特性就是加强了编译器自动类型推导的能力,使之不限于模板 —— 与此相关的关键字有两个 auto 和 decltype 。 auto 我们来看看 auto 关键字在 C++ 中的使用。 最简单的用法,定义变量的时候不指定类型,通过初始化的值让编译器自动推导。 (const auto& pa : m) { // ... } 当然,用自动类型推导的时候,也可能引入一些坑。

    1.9K30发布于 2020-06-02
  • 来自专栏leoay

    C++自动类型推导和其他

    自动类型推导 auto & decltype() 关于类型可能很多同学会觉得这个话题比较简单,因为这基本是所有语言的基础,C/C++、Java等等这些静态类型语言... ,基本都放在第一章节讲解,而且很多语言是相通的,但是C++有一个比较强大的关键字auto,我觉得有必要强调一下。 其实,我们可以根据这个词的意思差不多猜出这个关键字的功能 —— 自动类型推导。 我们定义了一个迭代器pred_box,这里由于auto会自动推导类型,我们几乎什么都不用管。但是实际上它的类型是什么样的呢? 说完auto,C++中还有一个与自动类型获取有关的关键字 —— decltype。 那么这二者有什么区别呢? auto关键字根据表达式的值推导类型,可以假想为auto变成了这个类型(实际上不是)。 常量限定符const与 constexpr 讲完了自动类型推导,接下来说一下C++中与常量定义相关的两个关键词 const 和 constexpr。

    90210发布于 2019-12-27
  • 来自专栏C++

    深入解析C++的auto自动类型推导

    于是C++标准委员会在C++11标准中改变了auto关键字的语义,使它变成一个类型占位符,允许在定义变量时不必明确写出确切的类型,让编译器在编译期间根据初始值自动推导出它的类型。 这篇文章我们来解析auto自动类型推导推导规则,以及使用auto有哪些优点,还有罗列出自C++11重新定义了auto的含义以后,在之后发布的C++14、C++17、C++20标准对auto的更新、增强的功能 ,也就是说不写死变量的类型,让编译器自动推导,如果我们要修改代码,就不用去修改相应的类型,比如我们将一种容器的类型改为另一种容器,迭代器的类型不需要修改,如: std::map<std::string, return a + b; } int main() { auto i = add(1, 2); } 不用管传入给add函数的参数的类型是什么,编译器会自动推导出返回值的类型。 虽然在C++14中支持了自动推导函数的返回值类型,但却不支持返回的类型是initializer_list<T>类型,因此下面的代码将编译不通过: auto createList() { return

    1.2K20编辑于 2024-04-12
  • 来自专栏各类技术文章~

    TypeScript接口参数响应类型自动推导

    : AxiosRequestConfig<D>): Promise<R>; } 复制代码 具体做法是指定泛型 T参数,来让 TS 推导出响应数据类型,修改初始代码: // 假定接口A的路径是 '/apple }) 复制代码 这时候TS能够推导响应类型了, 当我们输入不存在的属性的时候,TS提示属性不存在。 指定参数类型 映射参数类型是简单的, 只需要在 params 参数指定: // 假定接口A的路径是 '/apple', 参数类型是 AppleReq, 响应类型是 AppleRes interface 有没有一个方法可以输入 sendRequest('/apple') 请求路径的时候, 就能够让 TS 推导请求&响应数据的类型呢? pageSize: 1 }) banana.then((res) => { const blah = res.data.data // -> boolean }) 复制代码 在 VSCode中还会自动提示有什么路径

    2.1K20编辑于 2021-12-08
  • 来自专栏C++

    查看自动类型推导结果的方法

    在《深入解析C++的auto自动类型推导》和《深入解析decltype和decltype(auto)》两篇文章中介绍了使用auto和decltype以及decltype和auto结合来自动推导类型推导规则和用法 ,虽然确定类型的事情交给编译器去做了,但是在有的时候我们可能还是想知道编译器推导出来的类型具体是什么,下面就来介绍几种获取类型推导结果的方法,根据开发的不同阶段,你可以在不同阶段采用不同的方法,比如在编写代码时 你只要将鼠标移到想要查看的那个变量上面,就会弹出这个变量的类型,不过要让IDE能够推导出代码中变量的类型,你的代码至少要没有语法错误,因为IDE会静态分析你代码来推导出这些类型,如下面的代码:int a 对于C++的内置类型,IDE基本上都能推导出来,但是遇到比较复杂的类型或者复杂的代码上下文中,IDE可能就有点不够智能了。 ,这时候可以借助C++的RTTI特性,C++标准库提供了typeid函数和type_info类,对变量或者类型调用typeid会返回一个type_info对象,type_info类里有一个成员函数name

    74810编辑于 2024-04-13
  • 来自专栏一个会写诗的程序员的博客

    Scala类型推导Scala类型推导

    根据Picrce的说法:“类型系统是一个可以根据代码段计算出来的值对它们进行分类,然后通过语法的手段来自动检测程序错误的系统。” 类型可以让你表示函数的域和值域。 Scala编译器自动推导参数的类型。注意我们也没有必要显示指定返回值的类型了。 型变 Scala的类型系统需要把类的继承关系和多态结合起来。类的继承使得类之间存在父子的关系。 实际上,编译器在进行词法解析时会自动推导类型自动为代码进行补全,并且编译的字节码与 以前无异。 基于流的类型推导在偏应用函数场景下,不能对参数类型省略 类型推导算法 类型推导(Type Inference)是现代高级语言中一个越来越常见的特性。其实,这个特性在函数式语言 中早有了广泛应用。 而HindleyMilner推导器是所有类型推导器的基础。

    2.9K20发布于 2018-08-20
  • 来自专栏magicsoar

    Effective Modern C++翻译(3)-条款2:明白auto类型推导

    条款2 明白auto类型推导 如果你已经读完了条款1中有关模板类型推导的内容,那么你几乎已经知道了所有关于auto类型推导的事情,因为除了一个古怪的例外,auto的类型推导规则和模板的类型推导规则是一样的 模板的类型推导涉及了模板,函数和参数,但是auto的类型推导却没有涉及其中的任何一个。 // 概念上的函数调用,参数 // 推导出的类型就是rx的类型 就像我说的那样,auto的类型推导和模板的类型推导是一样的。 无法推导出std::initializer_list<T>中T的类型 就像注释里指出的的那样,类型推导在这种情况下失败了,但是,重要的是认识到这里其实发生了两种形式的类型推导,一种来源于auto的使用 的lambda表达式可能需要在参数的声明时使用auto,不管怎样,这些auto的使用,采用的是模板类型推导的规则,而不是auto类型推导规则,这意味着,大括号的初始化式会造成类型推导的失败,所以一个带有

    976100发布于 2018-02-06
  • 来自专栏magicsoar

    Effective Modern C++翻译(2)-条款1:明白模板类型推导

    可以使用的语境,类型推导的普遍应用将程序员从必须拼写那些显然的,多余的类型的暴政中解放了出来,它使得C++开发的软件更有弹性,因为在某处改变一个类型自动的通过类型推导传播到其他的地方。 这一章提供了一些每一个C++开发者都需要了解的关于类型推导的基本信息,它解释了模板类型推导是如何工作的,auto是如何在此基础上建立自己的规则的,decltype是如何按自己的独立的规则工作的,它甚至解释了你如何强迫编译器来使类型推导的结果可见 通过这种方式,C++中模板的类型推导成为了一个巨大的成功,数百万的程序员向模板函数中传递参数,并获得完全令人满意的答案,尽管很多程序员被紧紧逼着的去付出比对这些函数是如何被推导的一个朦胧的描述要更多。 ),param的类型将会是const int&&,一个引用的引用,引用的引用在C++里是不允许的,避免他们的唯一方法在类型推导时忽略表达式的引用性(reference-ness)。 ,应为C++类型推导规则对于引用和指针类型的参数是如此的自然,看见他们一个个被写出来是一件很枯燥的事情,因为他们是如此的显而易见,和你在类型推导中期待的是一样的。

    1.1K100发布于 2018-02-06
  • 来自专栏IT杂谈学习

    c++入门】引用详解 | auto的类型推导 | 范围for循环 | nullptr空指针

    还有不用写类型可以自动推导的关键字?for遍历竟然还有我们没见过的面孔!新版空指针nullptr!本篇会对这些进行细致的讲解,以帮助大家更好的了解c++语法。 ️引用 ​ 你有没有被人起过外号? ☁️auto简介 “auto” 关键字是C++11引入的,用于自动推导变量的类型。它可以根据变量的初始值来确定变量的类型,从而简化代码编写和类型声明的过程。 ,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。 ☁️auto不能推导的场景 ⭐函数参数 由于函数参数的类型是在函数调用时确定的,编译器无法在编译时推导出参数的类型。 在 C++ 中,也可以使用 NULL 来表示空指针,但更推荐使用更加类型安全的 nullptr。

    1.2K10编辑于 2024-01-22
  • 来自专栏程序员

    深入理解 C++ 现代类型推导:从 auto 到 decltype 与完美转发

    C++11引入的现代类型推导功能,彻底改变了我们编写C++代码的方式。它让代码更简洁、更通用,也更易于维护。然而,要真正驾驭这一强大工具,就必须深入理解其背后的规则。 可维护性:当初始化表达式的类型改变时,auto的类型自动跟进,无需手动修改。通用性:在泛型编程和lambda表达式中,auto几乎是不可或缺的。 的类型推导规则关键洞察:auto的类型推导规则与模板类型推导规则几乎完全相同。 如果类型是确定的(如voidf(int&&);),那么它就是普通的右值引用。引用折叠C++中不允许直接定义引用的引用(如int&&)。但在模板类型推导的特定场景下(如万能引用),它们可能会产生。 现代C++类型推导是一个强大而复杂的系统。理解auto、decltype、万能引用和引用折叠之间的相互作用,是编写高效、现代、通用C++代码的关键。

    25110编辑于 2025-10-23
  • 来自专栏magicsoar

    Effective Modern C++翻译(5)-条款4:了解如何观察推导出的类型

    条款4:了解如何观察推导出的类型 那些想要知道编译器推导出的类型的人通常分为两种,第一种是实用主义者,他们的动力通常来自于软件产生的问题(例如他们还在调试解决中),他们利用编译器进行寻找,并相信这个能帮他们找到问题的源头 不管你属于哪一类(二者都是合理的),你所要使用的工具取决于你想要在软件开发的哪一个阶段知道编译器推导出的结果,我们将要讲述3种可行的方法:在编辑代码的时获得推导类型,在编译时获得推导类型,在运行时获得推导类型 对于这个工作,你的代码不能过于复杂,因为是IDE内部的编译器让IDE提供了这一项信息,如果编译器不能充分理解并解析你的代码,产生类型推导的结果,它就无法告诉你类型推导的结果。 C++ filt工具,来对这些重整后的名字进行解码),理解编译器的输出将变得容易起来,Microsoft的编译器提供了更清楚的输出,x的类型是int,y的类型是int const*. 这些结果可能既不是十分有用也不是那么精确,所以明白C++类型推导规则依旧很必要。

    99680发布于 2018-02-06
  • 来自专栏c++11

    c++11类型推导

    参考 effective modern c++ https://medium.com/@tjsw/%E6%BD%AE-c-11-universal-reference-rvalue-reference-move-semantics -1ea29f8cabdc C++11 新特性:decltype 模板类型推导 函数模板可以看成是这样: template<typename T> void f(ParamType param); ParamType :(推导规则推导的是T的类型) 1 ParamType是一个指针或者引用(非通用universal reference引用) 如果expr的类型是引用,忽略引用的部分 根据expr和ParamType对比来判断 auto类型推导和模板类型推导基本一致,auto相当于T,只有一个例外:{} auto x1 = 27; //auto: int auto x2(27); //auto: //a: int & 尾随返回值类型 //c++11版本 //auto作为函数返回值,不能推导出c和i的类型,因为这时候c和i还没有声明 //通过--> decltype(c[i])表示函数返回值类型在函数参数后声明

    74840发布于 2020-07-09
  • 来自专栏破晓

    类型推导的一二件事

    引言 类型推导不是重点内容,大家知道类型推导是怎么个事即可! 什么是类型推导 想必大家都用过auto这个非常受欢迎的关键字吧,「通常情况下,遇到类型复杂的变量,直接无脑auto」。 百度百科关于auto的介绍如下: 在C++中,auto关键字用于自动类型推断。它允许编译器根据初始化表达式自动推断变量的类型,从而使得代码更加简洁和易于维护。 但是有时候我们也有推导出该变量是什么类型的需求。 (); } 运行结果如下: 其中我们用到了一个函数:typeid 下面我们有必要好好介绍一下typeid 在C++中,typeid是一个运算符,用于获取一个表达式的类型信息。 类型推导和函数模板相结合 前面文章中,我们介绍了函数模板和类模板,今天我们将函数模板和类型推导结合起来 没有提供任何特例化的模板 template<class T> void func1(T a) {

    23010编辑于 2024-10-07
  • 来自专栏大数据

    C++一分钟之-auto关键字与类型推导

    在C++11标准中,auto关键字的引入极大地简化了程序员的编码工作,特别是在处理复杂类型声明时。它允许编译器根据初始化表达式自动推导变量的类型,从而减少了代码的冗余和潜在错误。 auto关键字简介 auto并非C++的新成员,早在C++98中它就被用于声明函数返回值的存储类型自动变量。但在C++11之后,它的功能得到了革命性的扩展,成为了类型推导的关键字。 ,否则编译器无法推导类型。 对于显而易见的简单类型,直接写出类型可能更有利于阅读。 结语 auto关键字及其带来的类型推导机制是现代C++编程中不可或缺的一部分,它不仅能够简化代码,提高开发效率,还能减少类型错误。 然而,恰当地使用auto,理解其背后的原理和限制,是每位C++开发者进阶的必修课。通过上述讨论和示例,希望你能更熟练地掌握auto的使用,编写出既高效又易于理解的C++代码。

    32210编辑于 2024-06-22
  • 来自专栏机器人课程与技术

    蓝桥ROS机器人之现代C++学习笔记2.3类型推导

    "type z == type x" << std::endl; return 0; }  g++ -std=c++17 2.07.decltype.cpp -o decltype 尾返回类型推导

    31130编辑于 2022-04-29
  • 来自专栏Golang语言社区

    类型转换 与 类型推导

    在Go语言中,不同类型的项之间赋值时,需要显式转换。 表达式 T(v) 将值 v 转换为类型 T 。 float64 = float64(i) var u uint = uint(f) 或者更简单的写法 i := 42 f := float64(i) u := uint(f) 当定义了一个变量,却没有显式指出其类型时 ,变量的类型由等号右侧的值(第一次赋值)推导出变量的类型。 // int f := 3.142 //float64 g := 0.867 + 0.5i //complex128 运行下面代码,可以输出类型 type %T\n", g) } 运行结果 i is of type int f is of type float64 g is of type complex128 你可以用这个方法,测试一下各种类型的数据

    746100发布于 2018-03-28
  • 来自专栏函数式编程语言及工具

    Scalaz(27)- Inference & Unapply :类型推导和匹配

    scala类型系统是通过找寻隐式转换类型证例(implicit type evidence)来判断代码中当前类型是否期待的类型从而确定是否发生类型错误(type error)。 在这个例子中不但限定了类型的正确性,而且还进行了些类型关系的推导。理论上我们可以用依赖类型(dependent type)来描述类型参数之间的关系,推导结果类型最终确定代码中类型的正确无误。 我们先用他举的一个例子来看看如何利用依赖类型类型实例通过隐式输入参数类型推导结果类型并判断输入参数类型正确性的: 1 trait TypeA 2 trait TypeB 3 4 trait //ype mismatch; found : Exercises.deptype.TypeA required: Exercises.deptype.TypeB 38 */ 以上例子利用依赖类型类型关系实现了类型推导和验证 Scalaz里的Unapply类型可以把许多不同款式的类型对应成抽离的F[],A和TC。其中TC是个typeclass,用来引导编译器进行类型推导

    1.4K80发布于 2018-01-05
  • 来自专栏ccf19881030的博客

    c++ - 如何自动将强类型枚举转换为int?

    c++ - 如何自动将强类型枚举转换为int? ,但是有一个小的区别:普通枚举可以转换为整数类型,而强类型枚举不能在没有强制转换的情况下实现。 因此,有没有办法将强类型的枚举值转换为整数类型而无需强制转换?如果是,怎么办? 最佳答案 强类型枚举,旨在解决多个问题,而不仅仅是您在问题中提到的范围界定问题: 提供类型安全性,从而消除了通过整数提升而隐式转换为整数的情况。 指定基础类型。 提供强大的作用域。 参考资料 https://www.coder.work/article/6815 C++ enum枚举类型详解

    7.2K20发布于 2021-03-20
  • 来自专栏韩曙亮的移动开发专栏

    C++】泛型编程 ④ ( 函数模板 与 普通函数 调用规则 | 类型自动转换 | 类型自动转换 + 显式指定泛型类型 )

    一、普通函数 与 函数模板 的调用规则 - 类型自动转换 1、函数模板和重载函数 定义了 函数模板 , 该 函数模板 可以接收 任意类型的参数 T , 但是要求这两个参数类型 T 和 返回值类型 T 必须是相同的 ; // 使用 template 关键字 声明函数模板 // 告诉 C++ 编译器 开始使用 泛型编程 // 定义的 T 是泛型类型 // 声明了多个泛型, 可以只使用其中的部分类型 // 使用函数模板时 std; // 使用 template 关键字 声明函数模板 // 告诉 C++ 编译器 开始使用 泛型编程 // 定义的 T 是泛型类型 // 声明了多个泛型, 可以只使用其中的部分类型 / 二、普通函数 与 函数模板 的调用规则 - 类型自动转换 + 显式指定泛型类型 1、类型自动转换 + 显式指定泛型类型 在上面示例的前提下 , 如果 传入参数 类型分别是 int 和 char , 并且强行指定 显式指定泛型类型 代码示例 : #include "iostream" using namespace std; // 使用 template 关键字 声明函数模板 // 告诉 C++ 编译器 开始使用

    89150编辑于 2023-11-17
  • 来自专栏homura的博客

    Rc-lang开发周记18 简单类型推导

    第一部分是最纯粹的类型推导,第二部分是实际将ast转换为带有类型信息的ast。 } force也很好理解,不是force的情况下原来有type则直接返回,而不是进行推导 Expr infer private def infer(expr: Expr): Type = { expr > tyCtxt.enter(infer(stmts.last)) case Call(target, args) => lookup(target) } Infer的部分主要还是在于表达式的类型推导 tyCtxt.enter(f) } def enter[T](f: => T): T = { tyCtxt.enter(f) } 除了普通的enter,还支持通过指定一个typeCtxt来推导 翻译的最小单元则是一个Module translator主要的想法就是通过infer获取类型,之后返回一个保存有意义的类型信息的ASTNode Expr def exprTrans(expr: Expr

    37040编辑于 2023-04-07
领券