c – 我可以使用std :: pair,但重命名.first和.second成员名称?

我遇到的一个常见设计问题是,我将两个变量捆绑在一起,然后失去了以有意义的方式引用它们的能力.

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的引用.

上一篇:该代码是否无法在C 17中编译?


下一篇:Redis key操作