2017-02-16 1 views
0

Можно ли определить операторов tilde ~ для перечислений? Например, у меня есть enum State в моем примере, и я хотел бы иметь возможность написать result &= ~STATE_FAIL;. я сделал что-то вроде этого:Перегрузка оператора тильды «~» для перечислений

#include <iostream> 

    enum State 
    { 
     STATE_OK      = 0x0, 
     STATE_FAIL     = 0x1,  
     STATE_LOW     = 0x2, 
     STATE_HIGH     = 0x4  
    }; 

    State & operator|=(State & a, const State b) 
    { 
     a = static_cast<State>(static_cast<int>(a) | static_cast<int>(b)); 
     return a; 
    } 

    State & operator&=(State & a, const State b) 
    { 
     a = static_cast<State>(static_cast<int>(a) & static_cast<int>(b)); 
     return a; 
    } 
    State & operator~(State& a) 
    { 
     a = static_cast<State>(~static_cast<int>(a)); 
     return a; 
    } 


int main() 
{ 
    State result = STATE_OK; 

    result |= STATE_FAIL; // ok 
    result &= STATE_FAIL; // ok 
    result &= ~STATE_FAIL; // fail 

    return 0; 
} 

Я получаю следующее сообщение об ошибке:

In function int main() : Line 35: error: invalid conversion from int to State compilation terminated due to -Wfatal-errors.

+0

Отливка перечислений в другом вопросе, но он не показывает взятие аргумент по значению и возврат значения вместо ссылок в ответе @tuple_cat для этого вопроса. Это важно при создании правильного _bitwise NOT_ 'operator ~'. –

ответ

3

Ошибки вы получаете вызываются с параметром в качестве неконстантных ссылок (которые не может связываться с временные, которые имеют выражение STATE_FAIL).

Также есть что-то не так в вашей реализации operator~: например. ваш operator~ изменяет параметр, который не является обычным обычным поведением ~, как показано на рисунке here.

Это должно работать ожидаемым образом, то есть она не изменяет свой аргумент и возвращает только результат операции:

State operator~(const State a) 
{ 
    return static_cast<State>(~static_cast<int>(a)); 
} 
+0

После игры в этом примере кажется, что наличие константы 'State &' как параметра для 'operator ~' предотвращает ее использование. Этот ответ правильный, вы должны избавиться от ссылки. –

+0

Наличие не-const ref в качестве параметра не препятствует использованию 'operator ~'. Как поясняется в ответе, это только предотвращает передачу временным выражениям (выражениям rvalue) в качестве аргумента, поскольку rvalues ​​не могут передаваться как неконстантные ссылки. – emlai

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