结构化绑定(Structured binding declarations)
可以绑定pair,tuple,数组,结构体,结构化绑定以后也可以修改原值,也可以使自定义类型支持结构化绑定,但是要修改std,感觉没什么必要。
std::tuple<int, double> func_two() {
return std::tuple(1, 2.2);
}
auto[i, d] = func_two();
cout << i << " " << d << endl;
map<int, string> mp = {
{
0, "a"},
{
1, "b"},
};
for(const auto& [x, y] : mp){
cout << x << " " << y << endl;
}
pair pa(4, string("hihi"));
auto&[x, y] = pa;
cout << x << " " << y << endl;
输出:
1 2.2
0 a
1 b
4 hihi
/*
vector vec = {1,2,3};
auto&[xx, yy, zz] = vec;
cout << xx << endl;
*/ vector当然不能使用结构化绑定啦
if-switch语句初始化(Initializers in if and switch statements)
变量的作用域划分的更明显了。
if (int a = 29; a < 101) {
cout << a;
}
std::any
一般顶多variant就足够用了,何必用Any呢 但在极端情况下,用any总比用void*强得多,鼓励实现避免小对象的动态分配
std::any a = 1;
cout << a.type().name() << " " << std::any_cast<int>(a) << endl;
a = 2.2f;
cout << a.type().name() << " " << std::any_cast<float>(a) << endl;
if (a.has_value()) {
cout << a.type().name() << std::endl;
}
a.reset();
// 可以这样判断类型
// assert(a1.type() == typeid(int));
if (a.has_value()) {
cout << a.type().name() << std::endl;
}
a = std::string("a");
// 这个string的类型名是真的恶心
cout << a.type().name() << ": " << std::any_cast<std::string>(a) << endl;
输出:
i 1
f 2.2
f
NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE: a
std::optional
具体可参考《C++干货系列——C++17新特性之std::optional》
其实就是为了防止我们平时在代码中返回一个不存在语义时随便设置的magic number。
std::variant
具体可参考《C++17之std::variant》
struct NoDefConstr_seven{
NoDefConstr_seven(int i){
std::cout << "NoDefConstr::NoDefConstr(int) called\n";
}
};
// variant类似于union,第一个参数必须拥有默认构造函数
std::variant<int, std::string> var{
"hi"}; // initialized with string alternative
std::cout << var.index() << std::endl; // prints 1
var = 42; // now holds int alternative
std::cout << var.index() << std::endl; // prints 0
try {
std::string s = std::get<std::string>(var); // access by type
int i = std::get<0>(var); // access by index
}
catch (const std::bad_variant_access& e) {
// in case a wrong type/index is used
std::cout << "hello\n";
}
// std::variant<NoDefConstr_seven, int> v1; 第一个参数没有构造函数 编译失败
// std::monostate就是防止全部的参数都没有默认构造函数
std::variant<std::monostate, NoDefConstr_seven, int> v2;
输出:
1
0
hello
具体可查看这篇文章《C++17之std::any》
std::string_view
平时代码中可以大规模使用的一个特性。其实对于string的争论一直没有停止过,很多人认为string是字节串而不是字符串,因为string是可以改变的,这一切争论到C++17可以停止了。string_view的substr与构造时间复杂度为O(1),且不会产生拷贝,因为substr只是一个指针操作。
并行算法库(Parallel algorithm of the STL)
这可以说是C++17最重要的几个特性之一,这个特性为几乎所有标准库函数加上一个执行策略参数,可以让使用者选择并行还是串行,这不仅包括七个新的算法,还有我们熟知的sort等。
std::shared_mutex
千盼万盼你终于是来了。。这个不需要解释了,就是读写锁了。
具体内容可参考:《C++ std::shared_mutex读写锁》
std::file_system
具体可参考《c++ filesystem》
这其实模子是boost的file_system,最早2003年就出来了,因为是跨平台的,所以可以说是非常舒服了。
namespace fs = std::filesystem;
fs::path pathToShow("/home/lzl/Desktop/execise");
cout << "exists() = " << fs::exists(pathToShow) << "\n"
<< "root_name() = " << pathToShow.root_name() << "\n"
<< "root_path() = " << pathToShow.root_path() << "\n";