如何强制模板参数成为枚举或枚举类?

Pie*_*tro 2 c++ enums templates

我实现了以下类:

template<typename Enum>
class EnumDescription
{
    //TODO Force Enum to be an enum type

public:
    static std::string get( const Enum val );
};
Run Code Online (Sandbox Code Playgroud)

这按预期工作,但现在我想将 Enum 模板参数限制为仅枚举/枚举类。

Sto*_*ica 7

取决于你的 C++ 风格。

C++17

最简单的写法是静态断言

template<typename Enum>
class EnumDescription
{
    static_assert(std::is_enum_v<Enum>);

public:
    static std::string get( const Enum val );
};
Run Code Online (Sandbox Code Playgroud)

C++20

您可以在模板上指定临时约束

template<typename Enum> requires std::is_enum_v<Enum>
class EnumDescription
{

public:
    static std::string get( const Enum val );
};
Run Code Online (Sandbox Code Playgroud)

或者,可能更好,具有可重用的概念

template<typename E>
concept EnumType = std::is_enum_v<E>;

template<EnumType Enum>
class EnumDescription
{

public:
    static std::string get( const Enum val );
};
Run Code Online (Sandbox Code Playgroud)

  • 如果需要,C++17 的解决方案可以适用于 C++11/C++14。 (2认同)