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