Рассмотрите код ниже:
- — определяемый пользователем тип без операторов.
Код: Выделить всё
MyType - – это определяемый пользователем тип с оператором+, определенный как бесплатная функция.
Код: Выделить всё
WithPlus - Существует неявный конструктор WithPlus из MyType
Код: Выделить всё
struct MyType {};
struct WithPlus {
WithPlus(MyType m) {}
};
WithPlus operator+(WithPlus, WithPlus) { return WithPlus{MyType{}}; }
auto result = MyType{} + MyType{};
Проблема, с которой я столкнулся, заключается в том, что когда базовым типом является класс перечисления, это не работает.
Код: Выделить всё
enum class MyType {};
struct WithPlus {
WithPlus(MyType m) {}
};
WithPlus operator+(WithPlus, WithPlus) { return WithPlus{MyType{}}; }
auto result = MyType{} + MyType{};
ошибка: нет совпадения для «operator+» (типы операндов: «MyType» и «MyType»)
Справочная информация
Я пытаюсь создать класс Bitmask, где T — это класс перечисления. Идея состоит в том, чтобы определить побитовые операторы, например:
Код: Выделить всё
Bitmask operator|(Bitmask, Bitmask)
Код: Выделить всё
Bitmask mask = EnumClass::value1 | EnumClass::value2;
Вопрос
Почему вышеописанное работает для структуры MyType, но не для класса Enum MyType? И есть ли способ заставить его делать то, что я хочу?
Изменить
При использовании именованной функции вместо оператора происходит неявное преобразование. Таким образом, класс enum участвует в преобразованиях, определяемых пользователем, но по какой-то причине не для операторов. Приведенный ниже код компилируется и вызывает func(WithPlus, WithPlus):
Код: Выделить всё
enum class MyType {};
struct WithPlus {
WithPlus(MyType m) {}
};
WithPlus func(WithPlus, WithPlus) { return WithPlus{MyType{}}; }
auto result = func(MyType{}, MyType{});
Код: Выделить всё
enum class MyType {};
struct WithPlus {
WithPlus(MyType m) {}
};
WithPlus operator+(WithPlus, WithPlus) { return WithPlus{MyType{}}; }
auto result = MyType{} + MyType{};
Код: Выделить всё
enum classЯ знаю, что он не преобразует неявно в int, это не мой вопрос.
EDIT2
Я думаю, что нашел ответ здесь. Не стесняйтесь закрыть дубликат этого вопроса (хотя это определенно не дубликат вопроса «почему класс enum безопаснее»)
Подробнее здесь: https://stackoverflow.com/questions/798 ... -operators
Мобильная версия