C++17的新特性(二)
Nova这就来为你讲解C++17的新特性!ヾ(◍°∇°◍)ノ゙
if-switch语句初始化允许我们在if和switch语句的条件判断部分声明一个变量,这个变量的作用域被限制在if-switch语句块内,可以避免变量作用域泄漏,让代码更加简洁安全。例如:
if (std::lock_guard<std::mutex> lg(mt); shared_resource.is_free()) {
shared_resource.do_something();
} // 离开if语句块时,锁自动被释放
switch (ConnectionType connection = get_connection_type(); connection) {
case ConnectionType::wifi: // ...
case ConnectionType::bluetooth: // ...
case ConnectionType::usb: // ...
} // 离开switch语句块时,connection变量自动销毁
内联变量让我们可以在类定义内部直接初始化静态成员变量,而无需再到类定义外部提供定义,写法上更加简洁统一:
struct A {
inline static int value = 10; // C++17 支持内联变量
};
int main() {
cout << A::value << endl; // 输出 10
}
折叠表达式可以让我们更方便地编写可变参数模板函数。C++17提供了四种折叠运算符: +
、-
、*
、&
、|
、&&
、||
,可以对参数包中的所有元素进行求和、求积等运算:
template <typename... Args>
auto sum(Args... args) {
return (... + args); // 对参数包中所有元素求和
}
template <typename... Args>
void print_all(Args... args) {
(cout << ... << args) << endl; // 输出参数包中所有元素
}
sum(1, 2, 3, 4, 5); // 返回 15
print_all(1, 2.2, "hello", true); // 输出 "12.2hellotrue"
Nova觉得折叠表达式是一个非常强大的特性,它让可变参数模板的使用变得更加灵活方便了呢!(๑•̀ㅂ•́)و✧
构造函数模板推导其实就是让编译器根据构造函数的参数类型自动推导模板类型参数,这样我们在构造对象时就不需要显式指定类型了。比如:
std::pair p1(1, 2.2); // C++17 自动推导出 p1 的类型是 std::pair<int, double>
std::tuple t1(4, 3, 2.5); // C++17 自动推导出 t1 的类型是 std::tuple<int, int, double>
是不是感觉方便很多?Nova也觉得这个特性非常实用呢!(๑•̀ㅂ•́)و✧
结构化绑定可以让我们方便地把一个结构体或者数组解包成独立的变量,像这样:
std::tuple<int, double, string> f() {
return {1, 2.2, "hello"};
}
auto [x, y, z] = f(); // x, y, z 分别绑定到 f() 返回的 tuple 的三个成员
cout << x << ", " << y << ", " << z; // 输出 "1, 2.2, hello"
通过结构化绑定,我们可以直接把 tuple
或 pair
"解包"成独立的变量,是不是很神奇?这在迭代 map
时也很有用:
std::map<int, string> m = {{1, "one"}, {2, "two"}};
for (auto& [num, str] : m) {
cout << num << ": " << str << endl;
}
// 输出:
// 1: one
// 2: two
结构化绑定大大简化了我们的代码,Nova真心觉得它是个很棒的新特性!ヽ(✿゚▽゚)ノ