C++ enum class std:: размер t неявное преобразование



Я определил кортеж и его индексы, создав класс enum:



/** parameter { key ; value1 ; value1 ; } */
using Parameter = std::tuple<unsigned, unsigned, unsigned>;
enum class ParameterKey : std::size_t {
KEY = 0,
VALUE1 = 1,
VALUE2 = 2
};


Теперь я хотел бы получить значение из этого кортежа:



const auto& key = std::get<ParameterKey::KEY>(*parameterPointer);


Я думал, что неявное преобразование из int в std::size_t обеспечивается синтаксисом : std::size_t:



enum class ParameterKey : std::size_t {
....
}


Но я получаю эту ошибку



error: no matching function for call to ‘get<KEY>(std::tuple<unsigned int, unsigned int, unsigned int>&)’


Это прекрасно работает, но слишком болтливо:



const auto& key = std::get<static_cast<unsigned>(ParameterKey::KEY)>(*parameterPointer);
657   2  

2 ответов:

Здесь нет неявного преобразования. Из перечисления:

Неявные преобразования значений области видимости отсутствуют. перечислитель к целочисленным типам, хотя static_cast может использоваться для получите числовое значение перечислителя.

Таким образом, вы должны использовать static_cast.


Есть некоторые обходные пути, которые основаны на static_cast. Например, можно было бы использовать std::underlying_type:

template<typename T>
constexpr auto get_idx(T value)
{
    return static_cast<std::underlying_type_t<T>>(value);
}

А затем:

const auto& key = std::get<get_idx(ParameterKey::KEY)>(*parameterPointer);

Вся цель enum class состоит в том, чтобы не быть неявно конвертируемым в int, поэтому не существует неявного преобразования.

Вы можете создать свою собственную версию get:

template <ParameterKey key, typename Tuple>
decltype(auto) get(Tuple &&tuple) {
    return std::get<static_cast<std::underlying_type_t<ParameterKey>>(key)>(tuple);
}

Затем:

const auto& key = get<ParameterKey::KEY>(*parameterPointer);

Comments

    Ничего не найдено.