C++17新特性
C++17新特性
语言特性
使用
auto声明非类型模板参量折叠表达式
提供模板参数包的折叠
template <typename... Args>
bool logicalAnd(Args... args) {
// 二元折叠
return (true && ... && args);
}
bool b = false;
bool& b2 = b;
logicalAnd(b, b2, true); // == false template <typename... Args>
auto sum(Args... args) {
// 一元折叠
return (... + args);
}
sum(5, 5.0, 7); // == 17
内联变量
constexpr lambda使用
constexpr完成编译时的lambda表达式列表初始化推导新规则
auto x = {1, 2, 3}; // deduct to std::initializer_list<int> before ,now deduct to int
嵌套命名空间
这个特性使命名空间嵌套更加简洁:
// before c++17
namespace A{
namespace B{
namespace C{
int i;
}
}
} // c++17
namespace A::B::C{
int i;
}
结构绑定
这个特性可以用于解结构初始化,使用方式为
auto [x,y,z] = expr;当expr为类元组对象时,其中的元素将对应绑定到x,y,z。类元组对象包括std::pair,std::turple,std::array等。// first example
using Pair = std::pair<int, int>;
Pair init(){
return Pair{0, 0};
} const auto [x, y] = init();
x; // x == 0
y; // y == 0 // second example
using u_map = std::unordered_map<std::string, int>;
u_name mapping{
{"a", 1},
{"b", 2},
{"c", 3}
}; // destructure by reference
for (const auto [key, value] : mapping){
cout << key << ":" << value << endl;
}
选择语句初始化器
if initializer// before c++17
std::mutex mtx;
{
std::lock_guard<std::mutex> lk(mtx);
if (v.empty()) v.push(val);
} // c++17
std::mutex mtx;
{
if (std::lock_guard<std::mutex> lk(mtx); v.empty()){
v.push(val);
}
}switch initializer// before c++17
A apple(args);
switch(auto s = apple.stat()){
// body
} // c++17
switch(A apple(args); auto s = apple.stat()){
// body
}
constexpr if用于编写依赖于编译时条件实例化的代码
UTF-8 字面字符
char c = u8'a';
枚举列表直接初始化
枚举现在能够使用列表进行初始化
enum byte: unsigned char{};
byte a = {0};
byte d = byte{256};
[[nodiscard]][[fallthrough]][[maybe_unused]]属性__has_include宏操作符这个特性可以用来检查库是否可以被引入。
#ifdef __has_include
#if __has_include(<iostream>) // 如果能够引入,返回true
#include <iostream>
#define have_iostream 1
#else
#define have_iostream 0
#endif
类模板参数推导(
CTAD)这个特性,使类模板的参数也能够进行推导
std::vector nums{1, 2, 3}; // deduct to std::vector<int> std::mutex mtx;
auto lk = std::lock_guard{mtx}; // deduct to std::lock_guard<std::mutex> auto p = std::pair{0.2, 0.3}; // deduct to std::pair<int, int>
库特性
std::variants相当于类型安全的
union,同时只能存在一个值std::variant<int, int, double> v{1.20};
std::get<double>(v); // 1.20
std::get<2>(v); // 1.20
std::optionalstd::optional<std::string> create(bool b) {
if (b) {
return "cts";
} else {
return {};
}
} create(false).value_or("mx"); // == "mx"
create(true).value(); // == "cts"
std::any类型安全的容器,存放任意类型的单值。
std::any x{1};
any_cast<int>(x);
std::any_cast<int&>(x) = 10; // x==10
int s = any_cast<int>(x); // 这一步会将x存储的值转换为一个左值。
std::string_view非所有权字符串引用
std::invoke唤醒一个有参数的可调用对象
std::apply唤醒一个有参数元组的可调用对象
std::filesystem提供操作文件系统目录、文件和路径的标准方式。
std::byte提供一个以字节表示数据的标准方式,与
char和unsigned char相比的优点是byte对象非字符类型和算术类型,只能够使用位操作。std::byte x {0};
std::byte y {0xAA};
std::byte z = x & y;
int i = std::to_integer<int>(z); // 0
map和set的分片并行算法
增加了
find,copy,sort的并行执行操作par并行,seq顺序,par_unseq并行非顺序std::vector v;
std::find(std::execution::par, v.begin(), v.end(), 2);
std::samplesample给定学列中的若干个元素,每个元素都有一个均等的被挑选的机会。std::clampclamp的作用是获取一个在由高值、低值范围限定的给定值。std::reduce与
std::accmulate类似,在<numeric>中。prefix sum algorithmsinclusive_scan和exclusive_scanGCD (great common divisor)和LCM (least common multiple)最大公约数和最小公倍数,最小公倍数是基于最大公约数进行计算的
const int a = 9;
const int b = 3;
std::gcd(a, b); // 3
std::lcm(a, b); //
std::not_fn返回给定函数结果的否定值
字符串转换
to/from数字to_chars()from_chars()
C++17新特性的更多相关文章
- c++17 新特性
编译环境说明:gcc 8.1 + eclipse +windows 10 eclipse cpp默认支持c++14,做c++17开发时,需要手动进行配置. 1.关键字 1)constexpr c++1 ...
- Java 17 新特性:switch的模式匹配(Preview)
还记得Java 16中的instanceof增强吗? 通过下面这个例子再回忆一下: Map<String, Object> data = new HashMap<>(); da ...
- C++17 新特性之 std::optional(上)
最近在学习 c++ 17 的一些新特性,为了加强记忆和理解,把这些内容作为笔记记录下来,有理解不对的地方请指正,欢迎大家留言交流. 引言 在介绍之前,我们从一个问题出发,C++ 的函数如何返回多个值? ...
- C++11 & C++14 & C++17新特性
C++11:C++11包括大量的新特性:包括lambda表达式,类型推导关键字auto.decltype,和模板的大量改进. 新的关键字 auto C++11中引入auto第一种作用是为了自动类型推导 ...
- 从Java 9 到 Java 17 新特性梳理
Java 9 新的创建集合的方法 // [1, 2, 3, 4] List<Integer> integers = List.of(1, 2, 3, 4); // {1,2,3} ...
- C++17新特性optional和string_view
1. optional的作用 类模板 std::optional 管理一个可选的容纳值,即可以存在也可以不存在的值. 一种常见的 optional 使用情况是一个可能失败的函数的返回值.与其他手段,如 ...
- Java9至17的新特性总结
总览 讲讲Java 9-17 的一些语法糖和一些新发布的jeps, 重点讲讲JVM的垃圾回收器 时间线 SpringBoot 为什么选择Java17这个版本.我估计跟下面这个图有关系. Java 8 ...
- 你需要了解的 C++ 17 Top 19 新特性(附精彩评论)
什么是 C++17? C++17(或 C++1z)是继 C++14 之后 C++ 编程语言 ISO/IEC 标准的下一次修订的非正式名称.C++17 现在功能已齐全,正在成为国际标准的路上.它的规范已 ...
- JDK 16 正式发布,一次性发布 17 个新特性…不服不行!
上一篇:Java 15 正式发布, 14 个新特性 JDK 16 正式发布 牛逼啊,JDK 15 刚发布半年(2020/09/15),JDK 16 又如期而至(2021/03/16),老铁们,跟上. ...
- 11g新特性-使用DNFS
NFS相信应该都很熟悉了,但是我们对它的性能一直有所诟病.Oracle在10g版本通过允许对数据库文件直接IO引入ASM.在11g版本中,Oracle对NFS提供了类似的增强,为了改进NFS的性能,开 ...
随机推荐
- 扫描版PDF目录制作指南
目前网上找到的扫描版的电子书往往没有目录,这使得阅读变得非常困难.本文总结我的经验,介绍快速制作扫描版 PDF 目录的方法,以便更轻松地阅读扫描版电子书. 本文首先介绍手动制作目录的方法,之后介绍如何 ...
- vue+thinkphp5实现微信扫码支付(NATIVE支付)
前言 统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返回预支付订单号的接口,目前微信支付所有场景均使用这一接口.下面介绍的是其中NATIVE的支付实现流程与PC端实现扫码支付流 ...
- 嵌入式HLS 案例开发步骤分享——基于Zynq-7010/20工业开发板(1)
目 录 前 言 3 1 HLS 开发流程说明 5 1.1 HLS 工程导入 5 1.2 编译与仿真 6 1.3 综合 8 1.4 IP 核封装 10 1.5 IP 核测试 14 前 言 本文主要介绍 ...
- 可重入锁思想,设计MQ迁移方案
如果你的MQ消息要从Kafka切换到RocketMQ且不停机,怎么做?在让这个MQ消息调用第三方发奖接口,但无幂等字段又怎么处理?今天小傅哥就给大家分享一个关于MQ消息在这样的场景中的处理手段. 这是 ...
- AOP模板
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- 论文阅读: 面向Planning的端到端智驾Planning-oriented Autonomous Driving
原文地址:https://arxiv.org/abs/2212.10156 背景 当代自动驾驶系统多采用序列化的模块化的任务处理方式,比如感知.预测.规划等.为了处理多样的任务.达到高水平智能,当代智 ...
- Spark大数据集群日常开发过程遇到的异常及解决思路汇总
总结/朱季谦 一.出现java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.()V ...
- Tiny RDM 刚上线就收获一众好评的Redis桌面开源客户端!值得拥有!
相信对Redis有频繁操作需求的用户,大部分会选择一个顺手的图形化界面工具来代替手动命令行操作以提高效率.Tiny RDM作为一款现代化轻量级的跨平台Redis桌面客户端,为用户提供了便捷高效的Red ...
- [oeasy]python0054_三引号_原样显示字符串_triple_quoted
三引号 回忆上次内容 \ 首先是转义字符 可以 和别的字符 构成转义序列 \a是 ␇ (bell), \b 退回一格 \t 水平制表符 \v.\f LineFeed \\ 输出 \ \" 输 ...
- MySQL之DML
DQL:SELECT * FROM 表名 DML(数据操作语言,它是对表记录的操作(增.删.改)!) 1. 插入数据 * INSERT INTO 表名(列名1,列名2, ...) VALUES(列值1 ...