我可以将作用域枚举用于带有模板的 C++ 标记分派吗?
Can I use a scoped enum for C++ tag dispatch with templates?
这里是模板新手。我正在试验以下代码:
#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>();
}
换句话说,如果函数不是从主线程调用的,我想引发一个编译时断言。显然编译器不接受枚举数作为模板参数,大喊 invalid explicitly-specified argument for template parameter 'T'
.
我知道我可以使用两个结构作为标签:struct ThreadMain
和 struct ThreadHelper
。不幸的是,枚举 cass 已经在我的项目中随处使用,我希望避免重复。为此,我如何重用现有的枚举 class?
您现有的代码已关闭。除了使用 typename
,您还可以直接使用 enum class
名称,作为 非类型模板参数 ,如下所示:
template<Thread T>
int f()
{
static_assert(T == Thread::MAIN);
return 3;
}
您还必须更改 static_assert
。
这里是模板新手。我正在试验以下代码:
#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>();
}
换句话说,如果函数不是从主线程调用的,我想引发一个编译时断言。显然编译器不接受枚举数作为模板参数,大喊 invalid explicitly-specified argument for template parameter 'T'
.
我知道我可以使用两个结构作为标签:struct ThreadMain
和 struct ThreadHelper
。不幸的是,枚举 cass 已经在我的项目中随处使用,我希望避免重复。为此,我如何重用现有的枚举 class?
您现有的代码已关闭。除了使用 typename
,您还可以直接使用 enum class
名称,作为 非类型模板参数 ,如下所示:
template<Thread T>
int f()
{
static_assert(T == Thread::MAIN);
return 3;
}
您还必须更改 static_assert
。