2

コンパイル時のType -> Enum Seriesマッピングを行うことは可能ですか?

例を示します。

たとえば、いくつかTypeの列挙値があります。

typedef int Type;

enum Enumerated { Enum1, Enum2, Enum3, Enum4 };

そして今、どういうわけか次のよう にEnum1述べています。Enum4Type


ここで、次のことを確認できるようにしたいと考えています (コンパイル時に mpl を使用して実行することをお勧めします)。

任意の型と列挙型が実際に相互にマップされている場合:

template <typename ArbitraryType, Enumerated E>
struct check_at_compile_time {
   // Somehow tricky evaluate this
   static const bool value;
};

結果は次のようになります。

check_at_compile_time<Type, Enum1>::value evaluates to TRUE

check_at_compile_time<Type, Enum2>::value evaluates to FALSE

check_at_compile_time<Type, Enum4>::value evaluates to TRUE

check_at_compile_time<int, Enum3>::value evaluates to FALSE

誰かがこれを実装する良い方法を知っているなら、私を助けてください。たぶん何かを使用してboost::mplいますが、よくわかりません。

ありがとう。

4

1 に答える 1

5

boost.mpl がなくても、この方法で実行できます。

template< Enumerated Value > struct Enumerated2Type { typedef void type; enum { value = false }; };
#define DEFINE_ENUMERATED_TYPE(TYPE, ENUM) template<> struct Enumerated2Type<ENUM> { typedef TYPE type; enum { value = true }; }
DEFINE_ENUMERATED_TYPE(int, Enum1);
DEFINE_ENUMERATED_TYPE(bool, Enum2);
DEFINE_ENUMERATED_TYPE(double, Enum3);
DEFINE_ENUMERATED_TYPE(std::string, Enum4);

そして、次の方法で実行できることを確認します。

template <typename ArbitraryType, Enumerated E>
struct check_at_compile_time {
    static bool const value = Enumerated2Type< E >::value && boost::is_same< ArbitraryType, typename Enumerated2Type< E >::type >::value;
};

テストされていませんが、このように動作するはずです。

于 2010-10-12T12:23:43.893 に答える