C++20中新增了一个非常有用的特性:结构化绑定(Structured Binding)。它能够让咱们便利地从一个容器类型中取出元素并绑定到对应的变量中,使得代码愈加简练、易读。接下来,本文将别离介绍结构化绑定的概念、类型以及如何完成一个能够被结构化绑定的类元组类型。
结构化绑定概念
结构化绑定是C++20中的一个语言特性,答应将一个结构体或许其他类似类型的容器中的元素按照一定的次序取出而且绑定到变量上,一起能够疏忽不需要的元素。 运用结构化绑定能够使代码愈加简练易读,一起也提高了代码的可维护性。相关于C++11中引入的std::tie()
方法,结构化绑定愈加直观和便利。
结构化绑定类型
在C++20中,主要有三种类型能够运用结构化绑定:
数组
关于数组来说,结构化绑定返回一个std::tuple
类型。
int a[3] = {1, 2, 3};
auto [x, y, z] = a; // x=1, y=2, z=3
Pair
关于std::pair
类型,结构化绑定返回一个std::tuple
类型。
std::pair<int, double> p = {1, 3.14};
auto [a, b] = p; // a=1, b=3.14
结构体
关于自定义结构体类型,结构化绑定返回该结构体对应的各个成员。
struct S {
int m1;
double m2;
};
S s = {1, 3.14};
auto [m1, m2] = s; // m1=1, m2=3.14
完成一个能够被结构化绑定的类元组类型
结构化绑定能够使代码愈加简练易读,一起也提高了代码的可维护性。咱们能够自定义一个能够被结构化绑定的类元组类型。
#include <iostream>
#include <tuple>
template <typename... Args>
struct MyTuple {
std::tuple<Args...> values;
template <typename... Ts>
MyTuple(Ts&&... args) : values(std::make_tuple(std::forward<Ts>(args)...)) {}
template <size_t Index>
auto& get() {
return std::get<Index>(values);
}
};
template <typename... Args>
auto make_mytuple(Args&&... args) {
return MyTuple<Args...>(std::forward<Args>(args)...);
}
int main() {
auto mt = make_mytuple(1, 2.0, "hello");
auto [a, b, c] = mt;
std::cout << a << ' ' << b << ' ' << c << std::endl; // 1 2 hello
mt.get<0>() = 100;
std::cout << mt.get<0>() << std::endl; // 100
}
在上述代码中,咱们自定义了一个MyTuple
类,其成员变量是一个std::tuple
类型。咱们能够运用std::make_tuple()
快速生成一个tuple,然后将其存储在MyTuple
目标的values
成员变量中。MyTuple
还提供了一个get()
成员模板函数,用来获取指定位置的元素。一起,咱们还提供了一个工厂函数make_mytuple()
,便利用户生成目标。
总结一下,咱们学习了C++20中的结构化绑定。经过结构化绑定,咱们能够轻松地从数组、Pair类型以及自定义结构体类型中取出元素并绑定到对应的变量中,使得代码愈加简练、易读。一起,咱们还经过完成一个自定义元组类型来加深了解。