2012-05-23 3 views
12

Есть ли тип черта, или можно написать типа признака is_scoped_enum<T>, что:Можно ли определить, является ли тип облачным типом перечисления?

  • если T является Scoped перечисление is_scoped_enum<T>::value является true и
  • если T любой другой тип, is_scoped_enum<T>::value является ложные
+0

By * scoped enum *, вы имели в виду перечисление C++ 11? – Nawaz

+1

@Nawaz: Обозначение enum - это то, что класс enum вызывается в C++ 11, да. –

+0

Просто из любопытства, какие практические приложения существуют для этого? – Xeo

ответ

22

Я думаю, тестирование, если это перечисление и не неявное преобразование в базовый тип должен сделать трюк.

template <typename T, bool B = std::is_enum<T>::value> 
struct is_scoped_enum : std::false_type {}; 

template <typename T> 
struct is_scoped_enum<T, true> 
: std::integral_constant<bool, 
    !std::is_convertible<T, typename std::underlying_type<T>::type>::value> {}; 
+2

Лучше использовать 'std :: basic_type ' вместо 'int'. Класс enum в C++ 11 может основываться на чем-то, не конвертируемом в 'int'. – kennytm

+0

@KennyTM хороший пункт. Ред. –

+0

@KennyTM: Какой тип? C++ 11 §7.2/2 гласит: «_enum-base_ назовет целостный тип»; существует ли интегральный тип, не конвертируемый в 'int'? –

Смежные вопросы