2017-08-11 140 views
1

我已經定義了一個元組及其指數通過創建一個枚舉類:C++枚舉類的std ::爲size_t隱式轉換

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

我想從intstd::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

有一個從一個枚舉類的任何事情,隱式轉換,你可以創建自己的'GET'。 – Holt

+0

好的,但':std :: size_t'語法的目的是什麼? – sukovanej

+1

@sukovanej指定[underlying_type](http://en.cppreference.com/w/cpp/types/underlying_type) – Caleth

回答

2

這裏沒有隱式轉換。從enum

有從作用域 枚舉積分類型的值的隱式轉換,儘管的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); 
+0

您需要將'constexpr'添加到'get_idx'來完成這項工作。 – Holt

+0

@好吧,正好! –

2

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