使用make_tuple进行比较

bay*_*yda 10 c++ idioms tuples c++11

可能重复:
通过'tuple'和'tie'实现比较运算符,这是个好主意?

有时我需要写一些丑陋的算符,
例如

lhs.date_ < rhs.date_ ||
lhs.date_ == rhs.date_ && lhs.time_ < rhs.time_ ||
lhs.date_ == rhs.date_ && lhs.time_ == rhs.time_ && lhs.id_ < rhs.id_ .....
Run Code Online (Sandbox Code Playgroud)

它让我非常恼火.
所以我开始避免写下面的内容:

std::make_tuple( lhs.date_, lhs.time_, lhs.id_ ) < 
    std::make_tuple(rhs.date_, rhs.time_, rhs.id_ );
Run Code Online (Sandbox Code Playgroud)

我几乎感到高兴,但请注意,我可能使用元组而不是他们的目的让我担心.

你能否批评这个解决方案?
或者这是一个很好的做法?
你怎么避免这种比较?

更新:
感谢指向std :: tie以避免复制对象.
并感谢指出重复的问题

K-b*_*llo 12

std::tuple比较运算符的声明表明:

比较LHS和rhs字典顺序,即,比较第一元素,如果它们是相等的,比较第二元件,如果这些是等效的,比较了第三元件,等等.

所以,你在做什么,不必创建不必要的临时对象的可能性,其他(可能优化掉),似乎确定了我.

注意等效的手段,!( lhs < rhs ) && !( rhs < lhs )而不是lhs == rhs,这是平等的.假设你的班级的等同平等意味着相同,这就没问题.请注意,这与例如访问set/ map按键没有什么不同.

为了避免临时性,你可以使用std::tie它为它的参数创建一个左值引用元组:

std::tie( lhs.date_, lhs.time_, lhs.id_ ) < 
    std::tie( rhs.date_, rhs.time_, rhs.id_ );
Run Code Online (Sandbox Code Playgroud)

以类似的方式,std::forward_as_tuple制作一组rvalue引用.

  • 为了效率,我至少会提到`std :: tie`或`std :: forward_as_tuple`. (2认同)