我遇到的一个常见设计问题是,我将两个变量捆绑在一起,然后失去了以有意义的方式引用它们的能力.
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的引用.
标签:std-pair,c,typedef,c17 来源: https://codeday.me/bug/20191006/1859389.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。