确保模板参数是枚举 class
Ensure template parameter is an enum class
有没有办法确保模板参数是枚举-class类型?
我知道 type_traits
有 std::is_enum
,但我不希望它匹配常规枚举,只是 enum_classes.
想要的效果示例:
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
我正在使用 C++11,不幸的是不能再更高了(尽管我很想知道解决方案,即使它涉及更新的标准)。
可能吗?
您可以通过以下方式实现:
template<typename T>
using is_class_enum = std::integral_constant<
bool,
std::is_enum<T>::value && !std::is_convertible<T, int>::value>;
Here 演示。
如果您更喜欢使用 SFINAE,同样可以通过以下方式实现:
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 {
};
有没有办法确保模板参数是枚举-class类型?
我知道 type_traits
有 std::is_enum
,但我不希望它匹配常规枚举,只是 enum_classes.
想要的效果示例:
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
我正在使用 C++11,不幸的是不能再更高了(尽管我很想知道解决方案,即使它涉及更新的标准)。
可能吗?
您可以通过以下方式实现:
template<typename T>
using is_class_enum = std::integral_constant<
bool,
std::is_enum<T>::value && !std::is_convertible<T, int>::value>;
Here 演示。
如果您更喜欢使用 SFINAE,同样可以通过以下方式实现:
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 {
};