2017-12-25 35 views
0

特定のインデックスを参照したいときに、明示的キャストを呼び出さずにstd:arrayインデックスとしてC++ enumクラスを使用します。明示的キャストなしでstd :: array indexとしてC++ enumクラスの列挙子を使用する方法

さらに、固定サイズのstd ::配列にtypedefを使用します。

typedef std::array<int, 3> MyType; 
enum class MyEnum { 
    ENUMERATOR0 = 0, 
    ENUMERATOR1 = 1, 
    ENUMERATOR2 = 2, 
}; 

ので、代わりの使用:

MyType my_type = {0}; 
my_type[static_cast<int>(MyEnum::ENUMERATOR0)] = 42; 

私が使用したい:

my_type[MyEnum::ENUMERATOR0] = 42; 

をので、私は私がMyType(STDの添字演算子をオーバーロードするために必要とされると仮定::配列)型です。しかし、私は、私のケースでは添え字演算子をどのようにオーバーロードするかを理解できませんでした。簡単にするために、私はtypedefの代わりにクラスを使用しないでください。 どうすればいいですか?

+0

MyType x={{1,2,3}}; 

置き換えます。#define INDEXを(a)の\t static_castを(a)の –

+0

あなたはなし '列挙MyEnum'、すなわちを使用して気にしない場合は'クラスには、問題はないはずです。 –

+0

'enum class'を使う理由はありますか?ユースケースとは何ですか?どのような問題が解決するはずですか? –

答えて

1

あなたが所有していないタイプの[]を無効にすることはできません。

http://en.cppreference.com/w/cpp/language/operators - operaror[]を非メンバーオーバーロードにすることはできません。

あなたはこれを行うことができます。近い

struct MyType: std::array<int, 3>{ 
    using base= std::array<int, 3>; 
    constexpr MyType():base{}{} 
    template<class A0, class...Args, 
    std::enable_if_t<!std::is_same<MyType, std::decay_t<A0>>{}, bool>=true 
    > 
    constexpr MyType(A0&& a0, Args&&...args):base{{std::forward<A0>(a0), std::forward<Args>(args)...}}{} 
    using base::operator[]; 
    constexpr int& operator[](MyEnum e){ return operator[](static_cast<std::size_t>(e)); } 
    constexpr int const& operator[](MyEnum e)const{ return operator[](static_cast<std::size_t>(e)); } 
}; 

を。私はマクロを使用

MyType x={1,2,3};