带有强类型枚举的模板参数推导

Use*_*ess 23 c++ templates strong-typing template-argument-deduction c++17

如果我有一个普通(弱)枚举,我可以使用它的枚举值作为非类型模板参数,如下所示:

enum { Cat, Dog, Horse };

template <int Val, typename T> bool magic(T &t)
{
    return magical_traits<Val>::invoke(t);
}
Run Code Online (Sandbox Code Playgroud)

并称之为: magic<Cat>(t)

据我所知,如果我有一个强类型的枚举,并且不想硬编码枚举类型,我最终得到:

enum class Animal { Cat, Dog, Horse };

template <typename EnumClass, EnumClass EnumVal, typename T> bool magic(T &t)
{
    return magical_traits<EnumVal>::invoke(t);
}
Run Code Online (Sandbox Code Playgroud)

现在我得写:magic<Animal, Animal::Cat>(t)这似乎是多余的.

有没有办法避免输入枚举类和值,缺少

#define MAGIC(E, T) (magic<decltype(E), E>(T));
Run Code Online (Sandbox Code Playgroud)

Sop*_*pel 18

你可以这样做,如果你可以使用C++ 17

#include <type_traits>

enum class Animal { Cat, Dog, Horse };

template <typename EnumClass, EnumClass EnumVal> 
void magic_impl()
{
    static_assert(std::is_same_v<EnumClass, Animal>);
    static_assert(EnumVal == Animal::Cat);
}

template <auto EnumVal>
void magic()
{
    magic_impl<decltype(EnumVal), EnumVal>();
}

int main()
{
    magic<Animal::Cat>();
}
Run Code Online (Sandbox Code Playgroud)

演示:http: //coliru.stacked-crooked.com/a/9ac5095e8434c9da

  • 从第一次提出这个问题起只用了5年时间! (5认同)

Joh*_*itb 14

对不起,我得告诉你

这不可能

拿宏,将它放入一个可怕的命名标题中,并保护它不受同事的清理脚本的影响.希望最好的.

  • 一些宏包装的时间然后......或者也许我可以存活一点点重复,只要我知道它不仅仅是我. (2认同)
  • 注意,以备将来参考:这个答案对于C ++ 11是正确的(这是我所要求的,并且是被标记的)。我将刻度线移到了当前接受的答案,因为这是个好消息,而且我以前没有意识到。 (2认同)