2013-12-02 2 views
9

Учитывая определенный тип пользователя, такие как:Должен ли я перегружать каждый оператор для того, чтобы класс вел себя как одна из его переменных-членов?

struct Word{ 
    std::string word; 
    Widget widget; 
}; 

Есть ли способ, чтобы сделать каждый перегруженный оператор класса ведут себя точно так же, как если бы это была просто строка? Или я должен реализовать класс следующим образом:

struct Word{ 

    bool operator < (Word const& lhs) const; 
    bool operator > (Word const& lhs) const; 
    bool operator <= (Word const& lhs) const; 
    bool operator => (Word const& lhs) const; 
    bool operator == (Word const& lhs) const; 
    bool operator != (Word const& lhs) const; 
    //etc... 

    std::string word; 
    Widget widget; 
}; 

убедившись, что я объяснить для каждой перегруженной операции строка содержит, и применяя поведение к только строковому значению.

+0

это просто для сравнения 'слово' в вашем классе? – user1810087

+1

Ну, вы могли бы дать ему оператора преобразования, но это не идеально. – chris

+0

@itwasntpete да, виджет следует игнорировать при создании реляционных сравнений –

ответ

8

Я бы сказал, что ваш лучший вариант - использовать std::rel_ops таким образом, что вам нужно будет только реализовать == и <, и вы получите функциональность всех из них. Вот простой пример из cppreference.

#include <iostream> 
#include <utility> 

struct Foo { 
    int n; 
}; 

bool operator==(const Foo& lhs, const Foo& rhs) 
{ 
    return lhs.n == rhs.n; 
} 

bool operator<(const Foo& lhs, const Foo& rhs) 
{ 
    return lhs.n < rhs.n; 
} 

int main() 
{ 
    Foo f1 = {1}; 
    Foo f2 = {2}; 
    using namespace std::rel_ops; 

    std::cout << std::boolalpha; 
    std::cout << "not equal?  : " << (f1 != f2) << '\n'; 
    std::cout << "greater?  : " << (f1 > f2) << '\n'; 
    std::cout << "less equal? : " << (f1 <= f2) << '\n'; 
    std::cout << "greater equal? : " << (f1 >= f2) << '\n'; 
} 

Если вам нужна более полная версия такого рода вещи использовать <boost/operators.hpp>

+0

Все, что мне нужно сделать, это включить «утилиту» и реализовать эти два метода? –

+0

В значительной степени, я собираюсь обновить ответ, чтобы включить операторов boost тоже, что в основном относится к стероидам. – aaronman

+0

@TrevorHickey вам также нужно делать 'using namespace std :: rel_ops' – aaronman

Смежные вопросы