我编写了一个使用枚举数据类型的类。现在我想将其概括为适用于任何类型的枚举数据列表。有没有办法编写一个只接受枚举数据类型的模板类;
我的问题是如何限制模板类仅接受枚举数据类型。
std::is_enum
。这是该网站的示例。
#include <iostream>
#include <type_traits>
class A {};
enum E {};
enum class Ec : int {};
int main()
{
std::cout << std::boolalpha;
std::cout << std::is_enum<A>::value << '\n';
std::cout << std::is_enum<E>::value << '\n';
std::cout << std::is_enum<Ec>::value << '\n';
std::cout << std::is_enum<int>::value << '\n';
}
这是一个使用该功能的类。
template <typename T>
struct A {
static_assert(std::is_enum<T>::value,"not an enum");
};
如果你没有 c++11,你也可以以相同的方式使用 boost 的
is_enum
,记住 boost 是开源的,所以如果你不想要整个东西,你可以查看代码。
使用
<type_traits>
:
#include <type_traits>
template <typename T>
struct foo
{
static_assert(std::is_enum<T>::value, "Must be an enum type");
....
};
在不使用C++11的情况下,如果你想将其限制为
特定枚举类型,可以通过指定
enum
类型作为模板参数类型来实现:
#include <iostream>
enum fred { A, B };
template <fred F>
void f(void) { std::cout << F << std::endl; }
int main()
{
f<B>(); // works
f<1>(); // generates an error
}
由于所有答案都使用仅在 C++17 中可用的
static_assert
,因此这里有一种使用 SFINAE 的方法,该方法将与 C++11 一起使用:
template<typename EventType, typename std::enable_if<std::is_enum<EventType>::value>::type* = nullptr>
class EventSystem {
};