C ++ - отображение типа в enum - PullRequest
2 голосов
/ 12 октября 2010

Возможно ли сделать время компиляции Type -> Enum Series отображение?

Иллюстрируя на примере:

Допустим, у меня есть Type и перечисляемое значение:

typedef int Type;

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

и теперь я как-то утверждаю следующее: "давайте свяжем Enum1 и Enum4 с типом Type (пока не знаю, как это реализовать).


Теперь я хочу иметь возможность проверить следующее (лучше сделать это с помощью 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, я не уверен.

Спасибо.

1 Ответ

5 голосов
/ 12 октября 2010

Вы можете сделать это таким образом, даже без 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;
};

Не проверено, но должно работать следующим образом.

...