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

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

Изменено 19.12.2019 12:05 rg45

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

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


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

http://coliru.stacked-crooked.com/a/1eb70e86550f0a05

#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 std::underlying_type_t<T>(e);
}

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/1eb70e86550f0a05

#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 std::underlying_type_t<T>(e);
}

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;
}