我可以将作用域枚举用于带有模板的 C++ 标记调度吗?

Ign*_*ant 2 c++ templates generic-programming

模板新手在这里。我正在试验以下代码:

#include <type_traits>

enum class Thread
{
    MAIN, HELPER
};

template<typename T>
int f()
{
    static_assert(std::is_same_v<T, Thread::MAIN>);
    return 3;
}

int main()
{
    f<Thread::MAIN>();
}
Run Code Online (Sandbox Code Playgroud)

换句话说,如果函数不是从主线程调用的,我想提出一个编译时断言。显然,编译器不接受枚举器作为模板参数,大喊大叫invalid explicitly-specified argument for template parameter 'T'

我知道我可以使用两个结构作为标签:struct ThreadMainstruct ThreadHelper. 不幸的是,枚举 cass 已经在我的项目中随处使用,我宁愿避免重复。为此,我如何重用现有的枚举类?

Ste*_*ell 9

您现有的代码很接近。除了使用typename,您可以直接使用enum class名称作为非类型模板参数,如下所示:

template<Thread T>
int f()
{
    static_assert(T == Thread::MAIN);
    return 3;
}
Run Code Online (Sandbox Code Playgroud)

你也必须改变static_assert

  • +1,但是最好将“N”用于*非类型*(值)模板参数,例如“template&lt;int N&gt;”的常见样式。“T”参数名称可能会错误地表明这是一个 **T** 类型参数,但事实并非如此。特别是他不是典型的“枚举”底层类型。 (2认同)