2013-08-21 30 views
3

假设我有几个成员变量的类:优雅的方式做顺序比较(C++)

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

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

bool operator==(MyClass param){ 
    return (a == param.a) && (b == param.b) && (c == param.c); 
} 

bool operator<(MyClass param){ 
    if(a < param.a) return true; 
    if(a > param.a) return false; 
    if(b < param.b) return true; 
    if(b > param.b) return false; 
    if(c < param.c) return true; 
    return false; 
} 

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

回答

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

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); 
} 
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<

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