C++17 新特性总结

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;
}

附录

补充中。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路过的小熊~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值