【问题标题】:Can I use a scoped enum for C++ tag dispatch with templates?我可以将作用域枚举用于带有模板的 C++ 标记调度吗?
【发布时间】:2021-01-07 19:04:48
【问题描述】:

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

#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 ThreadMainstruct ThreadHelper。不幸的是,枚举 cass 已经在我的项目中随处使用,我希望避免重复。为此,我如何重用现有的枚举类?

【问题讨论】:

  • 您的模板采用 typestd::is_same_v 比较类型Thread 是一个类型。但是Thread::MAINThread::HELPER 不是类型,它们是Thread 类型的

标签: c++ templates generic-programming


【解决方案1】:

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

template<Thread T>
int f()
{
    static_assert(T == Thread::MAIN);
    return 3;
}

您还必须更改static_assert

【讨论】:

  • +1,但是最好将N 用于非类型(值)模板参数,例如常见样式template&lt;int N&gt;T 参数名称可能不准确地表明这是一个 T 类型的参数,而它不是。特别是他不是典型的enum底层类型。
  • @bloody “这样会更好”,这只是一种意见,而不是规则或指南。
  • @JHBonarius 正是如此,那又怎样?
猜你喜欢
  • 2021-07-04
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多