2016-10-01 26 views
16

Şablon parametresinin enum sınıfı tipte olduğundan emin olmanın bir yolu var mı?Şablon parametresinin bir enum sınıfı olduğundan emin olun

Biliyorum type_traitsstd::is_enum var, ama enum_classes, sadece enum_classes düzenli enums eşleştirmek istemiyorum. istenilen etkinin

Örnek:

enum class EnumClass {}; 
enum Enum {}; 
class Class {}; 

template <typename T> 
void Example() 
{ 
    static_assert(/* T is EnumClass */, "`T` must be an enum class"); 
} 

Example<EnumClass>(); // Ok 
Example<Enum>(); // Error 
Example<Class>(); // Error 

Ben yeni standartlar içerir bile, yine de bir çözüm merak olurdu gerçi (herhangi bir yüksek gidemez maalesef C++ 11 ve kullanıyorum).

Mümkün mü?

cevap

17

Sen ile elde edebilirsiniz:

template<typename T> 
using is_class_enum = std::integral_constant< 
    bool, 
    std::is_enum<T>::value && !std::is_convertible<T, int>::value>; 

Here demo. Yanılıyorsam

template<typename T, typename _ = void> 
struct is_class_enum : std::false_type { 
}; 

template<typename T> 
struct is_class_enum < 
    T, 
    typename std::enable_if<std::is_enum<T>::value && 
          !std::is_convertible<T, int>::value>::type> : 
    public std::true_type { 
}; 
+0

düzelt ama sadece enum sınıfları örtük olarak dönüştürülebilir olmadığı gerçeği güveniyoruz: Eğer SFINAE kullanmayı tercih ediyorsanız


aynı ile elde edilebilir integrallere mi? Gizli bir dönüşüm operatörü tanımlamak mümkün değil mi? –

+1

@GiladNaaman “Enum sınıfı” ndan bir örtük operatörü nasıl tanımlarsınız? –

+0

Evet, kötüyüm, aslında bir “enum sınıfı” içindeki işleçleri veya işlevleri tanımlayamazsınız. –