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

【翻译】C++17的新特性简介

新特性一览 语言新特性 类模板的模板参数推断 用auto来声明非类型的模板参数 折叠表达式 auto对花括号初始化的新推断规则 Lambda的常量表达式形式 Lambda可以值捕获this了 内联变量...std::byte 拼接map和set 并行算法 类模板的模板参数推断(Template argument deduction for class templates) 对类模板的模板参数的推断就像编译器对函数参数的推导一样...中有介绍)列表,模板参数可以从它的实参的类型中推断出来了 template struct my_integer_sequence { // Implementation...log(msg); } std::variant 标准库模板类std::variant(变体/变种)代表了一个类型安全的union。...一个std::variant的实例每个时刻都只保留候选类型中的一个值(当然也可以是无值的),就像联合一样 std::variant v{ 12 }; std::get

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

    多态实现-虚函数、函数指针以及变体

    静态多态和动态多态的区别是在什么时候将函数实现和函数调用关联起来,是在编译时还是运行时。 传统上,静态多态分为函数重载和模板(也称为泛型编程)两种。而运行时多态则仅有虚函数一种。...,我们知道编译器是通过虚函数表来实现运行时多态操作的,那么对于普通的成员函数和虚成员函数,编译器的行为有什么区别呢?...有几个形参就写几个符号 从上述规则我们可以看出,C++中的重载只跟函数名和函数参数有关。...它被安插在每一个声明有(或者继承)一个或者多个虚函数的类对象中。...特点 在前面的内容中,我们讲了使用虚函数以及variant来实现多态的方案,既然二者都能实现多态,那么我们什么时候使用虚函数什么时候使用variant呢?

    96620

    C++17 std::variant 详解:概念、用法和实现细节

    toc简介在C++的发展历程中,C++17带来了许多实用的新特性,其中std::variant尤为引人注目。它本质上是一种类型安全的联合体,能够在同一时刻持有多种可能类型中的某一个值。...基本概念定义和使用std::variantstd::variant是一个模板类,借助模板参数包的特性,它能够存储多种不同类型的值。其声明形式如下:templatestd::string, double> v(123); v = "HelloWorld"; return 0;}判断variant中对应类型是否有值为了确保类型安全,经常需要判断...当std::variant中存储的是指定类型的值时,std::get_if会返回一个指向该值的指针;否则,返回nullptr。...应用场景解析命令行在解析命令行参数时,参数可能有多种类型,如整数、字符串等。std::variant可以方便地存储和处理这些不同类型的参数。

    6900

    std::variant和policy-based design的化学反应

    同时,也为policy——based design提供了新的书写方式。 std::variant简介 std::variant在之前的文章中讲过,简单叙述如下,如需详细了解,可翻看前文。...std::variant是类型安全的多形态容器,存储预定义类型中的一个,结合std::visit函数可以根据variant中实际存储的类型调用访问者的相应重载方法。...结合std::variant和Policy-based design可以产生什么样的化学反应呢,今天提出基于std::variant的Policy-based design。...我们发现,其仍然满足对扩展开放,对修改封闭的原则。 总结 Policy-based design不仅提供了灵活性,还具有很好的扩展性。有策略模式的地方就可以有Policy-based design。...当使用std::variant实现该模式时,浅显易懂,较继承和模板的实现方式具有更高的可读性。

    8510

    C++17,标准库有哪些新变化?

    看到一个介绍 C++17 的系列博文(原文),有十来篇的样子,觉得挺好,看看有时间能不能都简单翻译一下,这是第二篇~ C++17 有许多新的标准库变化,简单起见,这篇文章只介绍了以下内容:std::string_view...,标准模板库中新添加的并行算法,新的文件系统库,以及3个新的数据类型:std::any, std::optional, 和 std::variant.让我们来了解一下其中的细节....(译注: 单子(Monad) 是函数式编程编程的概念,简单理解的话可以看看这里) 我们再来看下 std::variant. std::variant std::variant 是一个类型安全的联合体(union...).一个 std::variant 实例存储着其指定类型中某一类型的数据,并且 std::variant 的指定类型不能是引用类型,数组类型以及 void 类型,不过 std::variant 可以指定重复的数据类型...(譬如指定多个int). std::variant 默认会以其第一个指定类型进行初始化,这就要求该类型(第一个指定类型)必须支持默认构造函数,下面是一个基于cppreference.com的代码示例:

    1.3K10

    全面盘点17个C++17的高级特性

    这种方式更加直观和简洁,尤其是在简单的条件初始化时。 3. 类模板参数推导(CTAD) CTAD 让编译器从类参数中自动推导出模板参数。这使得在不必显式指定模板参数的情况下更容易地使用模板。...::optional 和 std::variant std::optional 和 std::variant 是C++17中引入的两个新类型。...std::optional 表示一个可能存在也可能不存在的值,std::variant 代表一个类型安全的联合,可以保存不同类型的值。...>typename bob> struct foo {} 声明了一个名为 foo 的模板,它接受一个名为 bob 的模板模板参数。模板模板参数 bob 本身接受任意数量的模板类型参数。...这使我们能够创建一个通用的结构 foo,可以与任何接受任意数量类型参数的模板一起工作,例如 std::vector、std::list 或用户定义的模板。 9.

    3.4K11

    如何优雅的使用 std::variant 与 std::optional

    std::variant与std::optional是c++17加入的新容器,variant主要是为了提供更安全的union, 而optional除了存取T类型本身外, 还提供了一个额外的表达optional...它还有一个特殊的类型 std::nullopt_t, 这个类型与std::nullptr_t一样, 只有一个值, std::nullopt, optional在没有设置值的情况下类型就是std::nulopt_t...需要注意的是区别于前面的单参数operator()操作符, ponder中的LessThanVisitor和EqualVisitor都是双参数的, 这个其实使用也比较简单: std::variant<int...a < b; }, }, abc, def); std::visit本身是一个variadic template的实现, 我们在std::visit调用的时候传入多个参数即可完成双操作数的...方式完成对std::variant的访问, 以及相关的ponde的使用示例代码, 和介绍了一个利用c++17特性实现的overloaded特性.

    3.8K10

    C++17,optional, any, 和 variant 的更多细节

    https://blog.csdn.net/tkokof1/article/details/82660834 看到一个介绍 C++17 的系列博文(原文),有十来篇的样子,觉得挺好,看看有时间能不能都简单翻译一下...,这是第六篇~ std::optional, std::any, 和 std::variant 有一个共同特点:他们都支持就地构造.另外的,std::variant 还支持访问者模式....首先,我们要了解一下这3种数据类型的功能作用. std::optional 是一种可能包含也可能不包含某一类型对象的类型. std::variant 是一种类型安全的联合体 std::any 是一种可以包含任意类型...Construct in-place 什么是就地构造呢?...::variants 的列表(代码第11行).每个 variant 都可以包含以下的任一类型:char, long, float, int, double, long long.遍历 variant 列表并对每一个

    2.4K20

    EOS行为核心:解析插件chain_plugin

    } }; 接着,进入fc库的static_variant.hpp文件中寻找类static_variant,它包含一个模板函数visit: template typename...回过头继续看FC_REFLECT的两行代码,第一个参数传入的是结构体。第二个参数用圆括号包含,可以有多个,内容与结构体的成员一致。...该接口的返回值是一个显示所有生产者信息的列表,以及生产者投票总权重信息,最后也有一个more字段用于说明是否有更多未展示的符合条件的数据。...获取生产者出块安排 get_producer_schedule 无请求参数,返回参数的结构有三个字段: active,活跃的。...该接口的入参类型是一个变体对象variant_object,也就是说它没有像其他接口那样特别声明参数结构,而是在函数实现中,加入了对象的构造过程,参数对象最终通过abi_serializer::from_variant

    91220

    ​【刘文彬】 EOS行为核心:解析插件chain_plugin

    } }; 接着,进入fc库的static_variant.hpp文件中寻找类static_variant,它包含一个模板函数visit: template typename...回过头继续看FC_REFLECT的两行代码,第一个参数传入的是结构体。第二个参数用圆括号包含,可以有多个,内容与结构体的成员一致。...该接口的返回值是一个显示所有生产者信息的列表,以及生产者投票总权重信息,最后也有一个more字段用于说明是否有更多未展示的符合条件的数据。...获取生产者出块安排 get_producer_schedule 无请求参数,返回参数的结构有三个字段: active,活跃的。...该接口的入参类型是一个变体对象variant_object,也就是说它没有像其他接口那样特别声明参数结构,而是在函数实现中,加入了对象的构造过程,参数对象最终通过abi_serializer::from_variant

    1.1K20

    C++17常用新特性(九)---扩展的using声明

    这种方法的典型应用场景就是可以创建一个统一的lambda操作符重载。如下面的代码,通过可变类模板和一个自动推断向导实现了一个实现重载统一定义的lambda表达式。...Ts>是类模板的可变参数包。struct overload : Ts...这里Ts实际上是overload基类继承的所有参数类型。...>实际上是一个自动推导器,用来告诉编译器根据传入的参数类型推导出类模板的参数类型。...除了这个应用场景外,这个技术的另一个典型应用是std::variant 访问器。这个访问器将在后续的文章中进行介绍。...2 使用变长 using 声明继承构造函数 在C++17中,可以声明一个可变参数的类模板。这个类模板可以继承一个基类。基类可以代表任意参数类型。

    1K20

    看完这 7 条,模拟 C++ 新功能只是一个小目标!

    4 概念 概念是C++非常令人期待的特性,它通常应该属于C++ 20的一部分。概念本质上是模板的接口。概念允许编写比typename更精确的东西来定义模板参数。...我建议你用更容易方法:谨慎选择模板参数名称,并尽可能使用概念的名称。即使你无法在拥有概念之前替换typename,但是你依然有很大的自由来选择类型参数的名称。...以在为Iterator示例时,不要把将模板参数命名为typename命名为T或typename I,而是命名为使用typename Iterator。...我们永远不会因为某个变量是int而叫它int i,但对于模板类型,面对模板类型时我们会更倾向于这么做。 模板类型的名称在模板代码中到处都是,所以让我们给它取一个好名字,并使用正在开发的概念的标准名称。...比如std::optional,或std::variant,这两者出现在C++ 17中。如果你没有C++ 17,那么想要编写自己的实现并可靠地替换标准库的接口并通过完整的测试,并不是件容易的事情。

    67910

    C++中std::variant用法详解

    在 C++17 中引入了一个非常有用的类型 std::variant,它属于 C++ 标准库中的 variant> 头文件。...std::variant 是一个类型安全的联合体,可以存储固定集合中的任意类型的值。这使得 std::variant 成为处理那些可能需要存储不同类型数据的情况的理想选择。...std::endl; } 类型冲突 在使用 std::variant 时需要注意,如果存储的类型有可能在语义上重叠或不明确(比如 std::variant),就需要特别注意操作和类型检查的准确性...命令模式:在实现命令模式时,如果命令的参数类型多样,std::variant 可以作为一个通用的参数容器,提供统一的接口而隐藏实现细节。...它通过接受一个可调用对象和一个 std::variant 作为参数,可以应对 std::variant 包含的任意类型,这使得代码更加模块化和易于维护。

    1.6K10

    C++那些事之有趣的面试问题

    最近想出一些有趣的问题,做一个小总结,你能回答上来几个? 注:完整答案会在星球揭秘。 问题1:std::variant构造函数会调用几个类型构造,1个?2个?n个?...当 std::variant 包含类型不具有默认构造函数时会发生什么? 如何指定 std::variant 的初始值类型? 问题2:下面代码可以正常运行吗?...当 std::variant 的类型列表中没有默认构造函数时,有哪些解决方案? 如何显式构造 std::variant 以避免默认构造问题? 问题3:什么是monostate,解决了什么问题?...相关问题: 如何在 std::variant 中使用 std::monostate? std::monostate 的引入对 std::variant 的设计有哪些影响?...在什么情况下使用 std::monostate 是合适的? 问题4:defer_lock_t、try_to_lock_t、adopt_lock_t这三者的区别是什么?什么场景下使用?

    13810

    【源码解读】EOS测试插件:txn_test_gen_plugin.cpp

    ,熟不知,其他的测试手段,例如cleos,eosjs可能只有百级的量。...'["", 20, 20]' http://localhost:8888/v1/txn_test_gen/start_generation 参数列表为: 第一个参数为 salt,一般用于“加盐”加密算法的值...()("l", salt)))); 接下来,是对参数period和batch_size的储存为结构体作用域的变量以供结构体内其他函数调用,然后打印日志,最后调用arm_timer函数。...继续准备trx的参数: nonce,是用来赋值context_free_actions的 context_free_actions:官方介绍一大堆,总之就是正常action是需要代价的,要确权,要占用主网资源什么的...通过本文的学习,我们对于EOS插件的体系有了初步深刻的理解,同时我们也完全搞清楚了txn_test_gen_plugin 插件的功能,以及它为什么会达到一个比较高的tps的表现。

    1K50
    领券