首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java编译时类型和运行时类型「建议收藏」

一、前言 最近在做笔试题的时候,才看到有这么一个知识点,查了好几篇博客,在这里记录一下 二、是什么 Java引用变量有两个类型,一个是编译时类型,还有一个是运行时类型。...编译时类型是由声明该变量时使用的类型所决定,运行时类型是由该变量指向的对象类型决定 如果两种类型不一致,就会出现多态,因此就会将子类对象之间赋值给父类引用变量,称为向上转型,而不用进行类型转换。...如 Animal a = new Bird(),其中引用变量 a 的编译时类型是 Animal,运行时类型是 Bird,两者不一致,因此出现多态 当使用该对象引用进行调用的时候,有这么一条规则,对象调用编译时类型的属性和运行时类型的方法

65210

C++核心准则编译边学-F.19 对于只传递不处理的参数,使用模板类型TP&&并在传递时使用std::forward

&&并在传递时使用std::forward) Reason(原因) If the object is to be passed onward to other code and not directly...如果对象不在本函数内部使用而是继续传递给其他代码,我们希望本函数不会改变参数的常数特性和右值特性。...在这种情况下,也只有在这种(右值引用参数只传递不使用)情况下,将TP参数定义为TP&&(这里TP是模板类型)--这样可以无视并维持常量特性和右值特性。...TP&&类型的参数本质上总是应该在函数体中通过std::forward继续传递的。 译者注:最终还是要被某段代码作为左值使用的。...在下面情况下发出警示:对于函数使用TP&&类型参数(这里TP是模板类型参数名),除了在所有静态路径上精确地执行一次std::forward操作以外执行了任何(针对改参数的)其他处理。

1.2K00
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【云+社区年度征文】C++雾中风景16:std::make_index_sequence, 来试一试新的黑魔法吧

    在C++之中有一个很常见的需求,定义一组编译期间的数组作为常量,并在运行时或者编译时利用这些常量进行计算。现在假如我们需编译期的一组1到4的平方值。你会怎么办呢? 嗯.......由上面的代码看,它很简单,就是一个int类型,加上一组int数字,其实原理就是生成一组T类型的编译期间数字序列。它本质上就是个空类,我们就是要获取这个编译期的数字序列。...(不能使用C++17的std::apply) 这个时候就要再次请出我们今天的主角,使用std::make_index_sequnce和lambda表达式来完成这个工作了。...将tuple类型的参数个数进行了展开,生成了0到N - 1的编译期数字。...接下来我们再利用func_call_tuple函数和展开的编译期数字,依次调用std::get(tuple),并且通过lambda表达式依次的调用,完成了遍历tuple的逻辑。

    57300

    C++雾中风景16:std::make_index_sequence, 来试一试新的黑魔法吧

    在C++之中有一个很常见的需求,定义一组编译期间的数组作为常量,并在运行时或者编译时利用这些常量进行计算。现在假如我们需编译期的一组1到4的平方值。你会怎么办呢? 嗯.......由上面的代码看,它很简单,就是一个int类型,加上一组int数字,其实原理就是生成一组T类型的编译期间数字序列。它本质上就是个空类,我们就是要获取这个编译期的数字序列。...(不能使用C++17的std::apply) 这个时候就要再次请出我们今天的主角,使用std::make_index_sequnce和lambda表达式来完成这个工作了。...将tuple类型的参数个数进行了展开,生成了0到N - 1的编译期数字。...接下来我们再利用func_call_tuple函数和展开的编译期数字,依次调用std::get(tuple),并且通过lambda表达式依次的调用,完成了遍历tuple的逻辑。

    2.1K20

    浅谈 C++ 元编程

    类型推导的例子(代码)使用 std::tuple 作为参数,然后通过匹配的方法,提取 std::tuple 内部的变长参数。...实例化 (instantiation) 类似于函数的 绑定 (binding),是编译器根据参数的个数和类型,判断使用哪个重载的过程。...然后根据 SFINAE 规则: 使用 std::enable_if 重载函数 ToString,分别对应了数值、C 风格字符串和非法类型; 在前两个重载中: 分别调用 std::to_string 和...假设是脚本语言,这段代码是没有问题的:因为脚本语言没有编译的概念,所有函数的绑定都在 运行时 完成;而静态语言的函数绑定是在 编译时 完成的。...编译时常数计算 能让程序员使用程序设计语言,写编译时确定的常量;而不是直接写常数(迷之数字 (magic number))或 在运行时计算这些常数。例如,几个例子都是编译时对常数的计算。

    3.1K61

    C++17新特性:std::tuple及其相关功能解析

    应用场景std::apply在处理std::tuple时非常方便,尤其是在需要将std::tuple中的元素传递给一个函数时。...然后,我们使用std::make_from_tuple在createShape函数中根据不同的tuple参数创建不同类型的Shape对象。...在main函数中,我们创建了一个MyTuple对象t,不需要显式指定模板参数类型,编译器会根据传入的参数自动推导。应用场景推导指南在处理模板类时非常有用,尤其是在需要自定义模板参数的推导规则时。...在main函数中,我们创建了一个Container对象container,不需要显式指定模板参数类型,编译器会根据传入的std::vector自动推导。...应用场景std::any在处理不同类型的数据时非常有用,尤其是在需要存储和访问不同类型的数据时。

    6700

    每个开发者都应该了解的一些C++特性

    auto 的概念是让 c++编译器在编译时自动推断数据的类型,而不是每次都要求你手动声明类型。...没有 initializer 时你不能声明某些东西,这不难理解。像第五行这样,编译器是无法推断数据类型的。 最初,auto 的使用是非常受限的。在之后的版本中,auto 变得更加强大! ?...第 7 和第 8 行中,我使用了花括号初始化。这个特性也是 C++11 中新加入的。 记住,当使用 auto 时,必须确保你的编译器可以通过某种方式推断数据类型。...最后,就像前面提到的,当你使用复杂的数据类型时,编译器推断数据类型会非常有用。 ? 不要忘记查看第 25 行!表达式 auto [v1,v2] = itr.second 是 C++17 的新特性。...tuple 和 pair 非常相似,tuple 是一组各种数据类型的固定大小值的集合。 ? 有时候,使用 std::array会比使用 tuple 更加方便。

    77120

    《C++11》深入理解元组(Tuple)

    , " std::get(myTuple) std::endl; return 0;}元组的基本操作创建元组:使用std::make_tuple可以更方便地创建元组...简洁性:可以方便地返回多个值,避免使用结构体或类。易于使用:提供了简单的接口来访问和解包元素。缺点类型安全:访问元组元素时,必须确保索引正确,否则会导致运行时错误。...使用std::tie进行解包std::tie可以将元组的元素解包到多个变量中,这在处理函数返回值时非常方便。...使用std::get和类型推导std::get可以通过类型推导来访问元组中的元素,避免了硬编码索引。...元组的大小元组的大小是固定的,创建后不能更改。如果需要动态调整大小,考虑使用std::vector或其他容器。2. 元素类型的顺序元组中的元素类型是有顺序的,访问时必须确保使用正确的索引或类型。

    13510

    C++反射:深入探究function实现机制!

    导语 | 本文将深入Function这部分进行介绍,主要内容是如何利用模板完成对C++函数的类型擦除,以及如何在运行时调用类型擦除后的函数。...(三)TFunctionTraits::Details::FunctionCallTypes std::tuple类型,函数所有参数的tuple类型,注意类的成员函数首个参数是类对象本身。...三、 运行时函数的表达——Function类 为了实现类中函数的动态调用过程,我们需要对类的成员函数进行类型擦除,形成统一的MetaFunction后,方便运行时获取和调用,以获得运行时的动态调用能力。...,变为统一的类型(上一节中Function对象)存入MetaClass中组织起来,方便运行时动态使用的过程。...存储至m_userData,这部分只包含了对tuple的访问(std::tuple_element,std::get()),通过Uses结构体的特殊构造和tuple的辅助函数,可以借助不同的enum

    1.6K30

    如何优雅地实现C++编译期多态?

    (二)编译期多态的设计思路 参考前面的运行时多态模型: dyno的思路比较直接,尝试使用两个独立的部分来解决编译期多态的支持问题: Storage policy-负责对象的存储。...利用UserObject,我们可以很好的完成各种不同类型对象的类型擦除,很好的完全不同类型对象的统一存储和函数参数传递的目的。...同时,这个实现存在诸多的问题: 运行时实现,性能肯定有比较大的折扣。 比较彻底的类型擦除带来的问题,整个实现一点都不compiler time,编译期的基础类型检查也完全没有了。...再回到多个接口函数的存储上,这个是通过继承的std::tuple来完成的,所以我们在Interface的定义中也会发现这样的模板特化用法,实际就是取这个tuple中对应位置的元素...温馨提示:因公众号平台更改了推送规则,公众号推送的文章文末需要点一下“赞”和“在看”,新的文章才会第一时间出现在你的订阅列表里噢~

    99721

    C++反射深入浅出 - 3. function 实现分析

    主要内容是如何利用模板完成对C++函数的类型擦除, 以及如何在运行时调用类型擦除后的函数....std::tuple类型, 函数所有参数的tuple类型, 注意类的成员函数首个参数是类对象本身. 3....运行时函数的表达 - Function类 为了实现类中函数的动态调用过程, 我们需要对类的成员函数进行类型擦除, 形成统一的MetaFunction后, 方便运行时获取和调用, 以获得运行时的动态调用能力...反射函数的注册 函数的注册过程本质上是类的成员函数, 经由类型擦除后, 变为统一的类型(上一节中Function对象)存入MetaClass中组织起来, 方便运行时动态使用的过程....存储至m_userData, 这部分只包含了对tuple的访问(std::tuple_element, std::get()), 通过Uses结构体的特殊构造和tuple的辅助函数, 可以借助不同的

    1.7K20

    模板编程高级技巧与实战

    一、 CRTP(奇异递归模板模式)1.1 静态多态与代码复用核心思想:通过模板参数将派生类类型传递给基类,利用编译时多态替代运行时虚函数调用。这种技术能减少内存占用(无需虚函数表)并提升执行效率。...}};问题:每次更换协议需要创建新对象,无法在编译时进行类型检查C++20模板策略改进:templateclass NetworkClient {public...运行时开销 虚函数调用开销大,序列化操作涉及多次内存分配和类型转换 类型安全 使用std::vector存储原始数据,缺乏类型校验...ms五、更进一步:模板元编程优化方案5.1 核心优化思路静态多态替代动态多态:使用CRTP消除虚函数调用编译时类型反射:通过模板元编程自动生成序列化代码零拷贝技术:利用std::span和std::bitset...:消除间接调用开销,减少30%-50%运行时延迟编译时字段处理:通过元函数在编译期生成序列化代码,避免运行时判断折叠表达式:简化可变参数的处理逻辑std::span优化:避免不必要的容器拷贝(需C++20

    17320

    Newtypes 设计模式-实用总结

    这个作法的弊端就是: 当对语义化数据类型做【操作符-重载】时,操作符trait(比如,std::ops::Add)需要在每个语义化(tuple) struct上都被实现一遍。...借助于std::marker::PhantomData,将代表了语义单位的【泛型类型参数】作为【编译时】的类型标记,而不是【运行时】值。...前者为标量值数据类型; 后者为编译时语义标记。 前一个字段保存标量值; 后一个字段为std::marker::PhantomData占位类型标记。 有两个字段。 有两个泛型类型形参。...实现std::ops::Deref / std::ops::DerefMut trait,将其变形成【智能指针】和支持Deref Coercion。...敲黑板,强调重点:虽然此unit type仅只作为【编译时】类型标记(并不会渗入【运行时】),但由于【auto trait扩散规则】,咱们也必须对其做Clone, Copy, PartialEq, PartialOrd

    38020

    C++(STL):02---tuple容器

    三、定义和初始化tuple 当我们定义一个tuple时,需要指出每个成员的类型: std::tuple threeD; //使用默认构造函数 std::tuple...", 3, 20.00); //item类型为tuple 四、访问tuple成员 get()函数 我们可以使用first和second来访问pair容器的第一个元素和第二个元素...对于tuple可以使用其成员函数来处理元素,因此必须在编译期知道你打算处理的元素的索引值。...当使用type trait std::decay()时,第三个元素的类型衰退为const char* 可以借助函数对象reference_wrapper以及便捷函数ref()和cref()(全部都定义于...i,f,s的引用来创建//因此,创建之后,i=77,f=1.1,s="more light" 使用tie()时,允许使用std::ignore忽略tuple的某些元素。

    1.3K20

    简单的 C++ 结构体字段反射

    json::at 抛出异常 如果字段实际类型和 JSON 输入类型不匹配,函数 json::get_to 抛出异常 手写 to_json/from_json 需要写 2 份类似的代码: 一方面,需要复制粘贴...静态反射 实际上,实现序列化/反序列化所需要的信息(有哪些字段,每个字段的位置、名称、映射方法),在 编译时 (compile-time) 就已经确定了 —— 没必要在 运行时 (runtime) 动态构建...核心原理 是:利用 访问者模式 (visitor pattern),使用 元组 std::tuple 记录结构体所有的字段信息,通过 编译时多态 (compile-time polymorphism) ...2019/1/11 补充(by fredwyan) C++ 11 不支持 泛型 lambda 表达式,可以使用 泛型 functor 代替传入 ForEachField 的可调用对象,从而实现 编译时多态..._ std::endl; } 基于静态反射的开源库: https://github.com/qicosmos/iguana 使用编译时静态反射,相对于运行时动态反射,有许多优点: ?

    4.9K41

    简单的 C++ 结构体字段反射

    json::at 抛出异常 如果字段实际类型和 JSON 输入类型不匹配,函数 json::get_to 抛出异常 手写 to_json/from_json 需要写 2 份类似的代码: 一方面,需要复制粘贴...静态反射 实际上,实现序列化/反序列化所需要的信息(有哪些字段,每个字段的位置、名称、映射方法),在 编译时 (compile-time) 就已经确定了 —— 没必要在 运行时 (runtime) 动态构建...核心原理 是:利用 访问者模式 (visitor pattern),使用 元组 std::tuple 记录结构体所有的字段信息,通过 编译时多态 (compile-time polymorphism) ...2019/1/11 补充(by fredwyan) C++ 11 不支持 泛型 lambda 表达式,可以使用 泛型 functor 代替传入 ForEachField 的可调用对象,从而实现 编译时多态..._ std::endl; } 基于静态反射的开源库: https://github.com/qicosmos/iguana 使用编译时静态反射,相对于运行时动态反射,有许多优点: 7.

    6.4K32

    c++17好用的新特性总结

    std::tuple的隐式推导 在c++17以前,构造std::pair/std::tuple时必须指定数据类型或使用std::make_pair/std::make_tuple函数,c++17为std...::pair/std::tuple新增了推导规则,可以不再显示指定类型。...c++17之前,我们处理只读字符串往往使用const std::string&,std::string有两点性能优势: 兼容两种字符串类型,减少类型转换和内存分配。...在处理子串时,std::string::substr也需要进行拷贝和分配内存,而std::string_view::substr则不需要,在处理大文件解析时,性能优势非常明显。...通过使用std::variant,用户可以实现类似Rust的std::result,即在函数执行成功时返回结果,在失败时返回错误信息,上文的例子则可以改成。

    3.4K10

    C++11常用新特性快速一览

    类型推导 C++11 引入了 auto 和 decltype 这两个关键字实现了类型推导,让编译器来操心变量的类型。...这是因为在编译器读到 decltype(x+y) 时,x 和 y 尚未被定义。...注意值捕获的前提是变量可以拷贝,且被捕获的变量在 lambda 表达式被创建时拷贝,而非调用时才拷贝。如果希望 lambda 表达式在调用时能即时访问外部变量,我们应当使用引用方式捕获。...std::array 会在编译时创建一个固定大小的数组,std::array 不能够被隐式的转换成指针,使用 std::array 只需指定其类型和大小即可: std::array arr...元组 std::tuple 元组的使用有三个核心的函数: std::make_tuple: 构造元组 std::get: 获得元组某个位置的值 std::tie: 元组拆包 #include tuple

    2.6K50

    C++17 在业务代码中最好用的十个特性

    std::tuple 的隐式推导 在 c++17 以前,构造std::pair/std::tuple时必须指定数据类型或使用std::make_pair/std::make_tuple函数,c++17...为std::pair/std::tuple新增了推导规则,可以不再显示指定类型。...c++17 之前,我们处理只读字符串往往使用const std::string&,std::string有两点性能优势: 兼容两种字符串类型,减少类型转换和内存分配。...是一个可以存储任何可拷贝类型的容器,C 语言中通常使用void*实现类似的功能,与void*相比,std::any具有两点优势: std::any更安全:在类型 T 被转换成void*时,T 的类型信息就已经丢失了...通过使用std::variant,用户可以实现类似 Rust 的std::result,即在函数执行成功时返回结果,在失败时返回错误信息,上文的例子则可以改成: std::variant

    2.7K20
    领券