2017-08-11 12 views
1

私は列挙型クラスを作成することにより、タプルとそのインデックスを定義している:C++のenumクラスの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); 

私は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

が何かに列挙型クラスからの暗黙の型変換はありません、あなたはあなた自身の '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に基づいていくつかの回避策があります。たとえば、1は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

この作業を行うには、 'get_idx'に' constexpr'を追加する必要があります。 – Holt

+0

@Holt yep、まさに! –

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