std::file_system
C++17正式将file_system纳入标准中,提供了关于文件的大多数功能,基本上应有尽有,这里简单举几个例子:
namespace fs = std::filesystem;
fs::create_directory(dir_path);
fs::copy_file(src, dst, fs::copy_options::skip_existing);
fs::exists(filename);
fs::current_path(err_code);
file_system之前,想拷贝个文件、获取文件信息等都需要使用好多C语言API搭配使用才能完成需求,而有了file_system,一切都变得相当简单。file_system是C++17才引入的新功能,但其实在C++14中就可以使用了,只是file_system在std::experimental空间下。
结构化绑定 通过对象的元素或成员初始化多个实体
对于一个结构体MyStruct,可以将它绑定到两个变量上:
struct MyStruct {
int i = 0;
std::string s;
};
MyStruct getStruct() {
return MyStruct{42, "hello"};
};
MyStruct ms;
auto [u, v] = ms;
auto [x, y] = getStruct();
常见用法,遍历map:
// before C++17
for (const auto& elem : mymap) {
std::cout << elem.first << ": " << elem.second << std::endl;
}
// C++17
for (const auto& [key, val] : mymap) {
std::cout << key << ": " << val << std::endl;
}
if constexpr 在编译时完成分支判断
template<typename T>
auto print_type_info(const T& t) {
if constexpr (std::is_integral<T>::value) {
return t + 1;
} else {
return t + 0.001;
}
}
int main() {
std::cout << print_type_info(5) << std::endl;
std::cout << print_type_info(3.14) << std::endl;
}
在编译时,代码会被编译为:
int print_type_info(const int& t) {
return t + 1;
}
double print_type_info(const double& t) {
return t + 0.001;
}
int main() {
std::cout << print_type_info(5) << std::endl;
std::cout << print_type_info(3.14) << std::endl;
}
变参模版展开
template<typename T0, typename... T>
void printf2(T0 t0, T... t) {
std::cout << t0 << std::endl;
if constexpr (sizeof...(t) > 0) printf2(t...);
}
非类型模版参数推导
使用auto关键字推导模版的参数
template <int value> void foo0() {
std::cout << value << std::endl;
return;
}
template <auto value> void foo() {
std::cout << value << std::endl;
return;
}
int main() {
foo0<10>(); //ok
// foo0<1.1> // 参数不对
foo<10>(); // value 被推导为int类型
foo<1.1>(); // value 被推导为float类型
}
折叠表达式
#include <iostream>
template<typename ... T>
auto sum(T ... t) {
return (t + ...);
}
int main() {
std::cout << sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) << std::endl;
}
if/switch 变量声明强化
可以在if/switch语句中定义临时变量
// 将临时变量放到if语句内
if (const std::vector<int>::iterator itr = std::find(vec.begin(), vec.end(), 3);
itr != vec.end()) {
*itr = 4;
}
附录
补充中。。。。。。