2013-08-21 52 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<

此運算符將比較元組的每個元素。