Информация об изменениях

Сообщение Re[4]: enum class and if expression от 19.12.2019 10:51

Изменено 19.12.2019 10:55 rg45

Re[4]: enum class and if expression
Здравствуйте, удусекшл, Вы писали:

У>Хм, возможно. Но тогда почему не предоставлен механизм для использования в условных конструкциях?


А пока что, я думаю, не будет большим грехом заюзать для преобразования в udnerlying type какие-нибудь унарные операторы: унарный плюс, разыменование...

http://coliru.stacked-crooked.com/a/601529494177fdd2

#include <iostream>
#include <type_traits>
#include <utility>

template <typename T>
std::enable_if_t<std::is_enum_v<T>, std::underlying_type_t<T>> operator + (T e) {
    return e != T{};
}

template <typename T>
std::enable_if_t<std::is_enum_v<T>, std::underlying_type_t<T>> operator * (T e) {
    return +e;
}

enum class Flags : unsigned {
    one = 1,
    two = 2,
    four = 4,
};

int main() {
    if (+Flags::one)
        std::cout << "Ok" << std::endl;

    if (*Flags::two)
        std::cout << "Ok" << std::endl;
}


Логическое отрицание, само-собой.
Re[4]: enum class and if expression
Здравствуйте, удусекшл, Вы писали:

У>Хм, возможно. Но тогда почему не предоставлен механизм для использования в условных конструкциях?


А пока что, я думаю, не будет большим грехом заюзать для преобразования в udnerlying type какие-нибудь унарные операторы: унарный плюс, разыменование... Логическое отрицание, само-собой.

http://coliru.stacked-crooked.com/a/601529494177fdd2

#include <iostream>
#include <type_traits>
#include <utility>

template <typename T>
std::enable_if_t<std::is_enum_v<T>, std::underlying_type_t<T>> operator + (T e) {
    return e != T{};
}

template <typename T>
std::enable_if_t<std::is_enum_v<T>, std::underlying_type_t<T>> operator * (T e) {
    return +e;
}

enum class Flags : unsigned {
    one = 1,
    two = 2,
    four = 4,
};

int main() {
    if (+Flags::one)
        std::cout << "Ok" << std::endl;

    if (*Flags::two)
        std::cout << "Ok" << std::endl;
}