结构化绑定产生的原因
结构化绑定可以很容易的将值压缩到单独变量中,从而提高代码的可读性。
使用结构化绑定,可以直接将成员值分配给变量。
thing_pair<int,int>{47,9};
auto [this,that]=thing_pair;
cout<<format("{} {}\n",this,that);
输出为:
47 9
结构化绑定的使用
结构化绑定适用pair,tuple,array,array和struct。下面例子用了C数组:
int nums [] {1,2,3,4,5};
auto [a,b,c,d,e]=nums;
cout<<format("{} {} {} {} {}\n",a,b,c,d,e);
输出为:
1 2 3 4 5
结构化类型绑定使用自动类型推断,所以类型必须是auto。各个变量的名称都在方括号内[a,b,c,d,e]。在这个例子中,int型c数组nums包含五个值。使用结构化绑定将这五个值赋给变量(a,b,c,d,e);
这也适用于STL数组对象
array<int,5>nums{1,2,3,4,5};
auto [a,b,c,d,e]=nums;
cout<<format("{} {} {} {} {}\n",a,b,c,d,e);
输出为:
1 2 3 4 5
或者将它与tuple一起使用
tuple<int,double,string>nums{1,2.7,"three"};
auto [a,b,c]=nums;
cout<<format("{} {} {}\n",a,b,c);
输出为:
1 2.7 three
将它与结构体一起使用,按照定义的顺序接受变量
struct Things{int i{};double d{};string s{};};
Things nums{1,2.7,"three"};
auto [a,b,c]=nums;
cout<<format("{} {} {}\n",a,b,c);
输出为:
1 2.7 three
可以使用带有结构化绑定的引用,可以修改绑定容器中的值,同时避免数据复制:
array<int,5>nums{1,2,3,4,5};
auto& [a,b,c,d,e]=nums;
cout<<format("{} {}\n",nums[2],c);
c=47;
cout<<format("{} {}\n",nums[2],c);
输出为:
3 3
47 47
一些注意事项
1.因为结构化绑定使用auto类型推断,所以不能为绑定指定类型,必须使用auto。若使用类型进行绑定,会得到相应的错误信息。
2.对于函数的返回类型,通常使用结构化绑定:
struct div_result{
long quo;
long rem;
}
div_result int_div(const long&num,const long&denom){
struct div_result r{};
r.quo=num/denom;
r.rem=num%denom;
return r;
}
int main(){
auto [quo,rem]=int_div(47,5);
cout<<format("quotitent: {}, remainder: {}\n",quo,rem);
}
输出为:
quotient: 9, remainder: 2
用结构化绑定来解包结构可以使代码更清晰,更容易维护。