我遇到的一个常见设计问题是,我将两个变量捆绑在一起,然后失去了以有意义的方式引用它们的能力.
std::pair<int,int> cords;
cord.first = 0; //is .first the x or y coordinate?
cord.second = 0; //is .second the x or y coordinate?
我考虑过编写基本结构,但后来我失去了很多std :: pair带来的好处:
> make_pair
>非成员重载运算符
>交换
>得到
>等
有没有办法为第一个和第二个数据成员重命名或提供替代标识符?
我希望利用所有接受std :: pair的函数,
但仍然可以通过以下方式使用它们:
std::pair<int,int> cords;
//special magic to get an alternative name of access for each data member.
//.first and .second each have an alternative name.
cords.x = 1;
assert(cords.x == cords.first);
解决方法:
解决这个问题的一种方法是使用std::tie
.您可以将返回值绑定到您已命名的变量中,以便您拥有良好的名称.
int x_pos, y_pos;
std::tie(x_pos, y_pos) = function_that_returns_pair_of_cords();
// now we can use x_pos and y_pos instead of pair_name.first and pair_name.second
这样做的另一个好处是,如果您更改函数以返回元组绑定()也可以使用它.
使用C 17,我们现在有了structured bindings,它允许您声明并绑定多个变量到函数的返回.这适用于数组,元组/对象对象和结构/类(只要它们满足一些要求).在这种情况下使用结构化绑定允许使用将上面的示例转换为
auto [x_pos, y_pos] = function_that_returns_pair_of_cords();
你也可以
auto& [x_pos, y_pos] = cords;
现在x_pos是对cords.first的引用,而y_pos是对cords.second的引用.