如何限制模板类仅排除枚举数据类型

问题描述 投票:0回答:4

我编写了一个使用枚举数据类型的类。现在我想将其概括为适用于任何类型的枚举数据列表。有没有办法编写一个只接受枚举数据类型的模板类;

我的问题是如何限制模板类仅接受枚举数据类型。

c++ enums
4个回答
3
投票

在 c++11 中非常简单,你可以做

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 是开源的,所以如果你不想要整个东西,你可以查看代码。


2
投票

使用

<type_traits>

#include <type_traits>

template <typename T>
struct foo
{
    static_assert(std::is_enum<T>::value, "Must be an enum type");
    ....
};

0
投票

在不使用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
}

0
投票

C++11/C++14

由于所有答案都使用仅在 C++17 中可用的

static_assert
,因此这里有一种使用 SFINAE 的方法,该方法将与 C++11 一起使用:

template<typename EventType, typename std::enable_if<std::is_enum<EventType>::value>::type* = nullptr>
class EventSystem {
};

工作演示

© www.soinside.com 2019 - 2024. All rights reserved.