优雅的顺序比较方式(C ++)

时间:2013-08-21 17:20:49

标签: c++ class comparison

假设我有一个包含多个成员变量的类:

class MyClass{
    std::string a;
    int b;
    SomeOtherClass c;
    // some stuff...
public:
    // some other stuff...
};

我想定义首先比较operator<的关系运算符(a等),但如果a相等,则比较b,但如果{ {1}}相等,比较b。 (我们假设c已经定义了关系运算符。)所以我有类似

的东西
SomeOtherClass

等等。有没有更优雅的方式来做到这一点?这看起来很麻烦,特别是如果要比较很多成员变量的话。 (Boost是一种选择。)

3 个答案:

答案 0 :(得分:7)

是的,我通常会看到两种方式:

bool operator<(MyClass param){
    if(a != param.a) return a<param.a;
    if(b != param.b) return b<param.b;
    return c<param.c;
} 

http://coliru.stacked-crooked.com/view?id=dd70799c005e6e99c70ebda552161292-c96156d6cc95286981b0e9deef2eefae

bool operator<(MyClass param){
    return std::tie(a, b, c)<std::tie(param.a, param.b, param.c);
}

http://coliru.stacked-crooked.com/view?id=00278eaca0d73b099fcd8edf87b5057b-c96156d6cc95286981b0e9deef2eefae

答案 1 :(得分:3)

当然,您可以使用std::tie

#include <tuple>

bool operator<(const MyClass& lhs, const MyClass& rhs)
{
  return std::tie(lhs.a, lhs.b, lhs.c) < std::tie(rhs.a, rhs.b, rhs.c);
}

答案 2 :(得分:3)

当然,您可以使用std::tie

#include <tuple>

bool operator<(MyClass param){
    return std::tie( a, b, c ) < std::tie( param.a, param.b, param.c );
}

它会创建一个tuple,之后,您只需使用operator<

此运算符将比较元组的每个元素。