【发布时间】:2011-09-07 07:25:49
【问题描述】:
(注意:tuple 和 tie 可以取自 Boost 或 C++11。)
在编写只有两个元素的小型结构时,我有时倾向于选择std::pair,因为该数据类型的所有重要工作都已完成,例如用于严格弱排序的operator<。
缺点是几乎没有用的变量名。即使我自己创建了 typedef,我也不会记得 2 天后 first 和 second 到底是什么,特别是如果它们都是同一类型的话。对于两个以上的成员,情况会变得更糟,因为嵌套 pairs 非常糟糕。
另一个选项是 tuple,来自 Boost 或 C++11,但这看起来并没有更好更清晰。所以我回去自己编写结构,包括任何需要的比较运算符。
因为尤其是 operator< 可能会非常麻烦,所以我想通过仅依靠为 tuple 定义的操作来规避这整个混乱:
operator< 的示例,例如对于严格-弱排序:
bool operator<(MyStruct const& lhs, MyStruct const& rhs){
return std::tie(lhs.one_member, lhs.another, lhs.yet_more) <
std::tie(rhs.one_member, rhs.another, rhs.yet_more);
}
(tie 从传递的参数中生成 tuple 的 T& 引用。)
编辑:@DeadMG 提出的从tuple 私下继承的建议不错,但也有不少缺点:
- 如果运营商是独立的(可能是朋友),我需要公开继承
- 通过强制转换,可以轻松绕过我的函数/运算符(特别是
operator=) - 使用
tie解决方案,如果某些成员对订购无关紧要,我可以忽略它们
我需要考虑此实现中的任何缺点吗?
【问题讨论】:
-
在我看来完全合理...
-
这是一个非常聪明的想法,即使它没有成功。我将不得不对此进行调查。
-
我喜欢这个主意!如果
tie(...)调用将在各种运算符(=、==、make_tuple(...) 来封装它,然后从其他各种地方调用它,如return lhs.make_tuple() < rhs.make_tuple();(尽管声明该方法的返回类型可能很有趣!) -
@aldo:C++14 来救援!
auto tied() const{ return std::tie(the, members, here); } -
它使它更具可读性和更容易,但一个问题是字符串。这会导致两个运算符被调用 string 吗? string::compare 可用于只进行一次比较,而不是遍历字符串两次。元组的最坏情况可能会遍历字符串两次以检查是否相等。
标签: c++ c++11 operators tuples strict-weak-ordering