检查模板类型T是否是C++ 17中可变参数包的一部分

dan*_*ani 4 c++ variadic-templates c++17

我想检查一个类型T也是参数包的一部分Ts.有些解决方案可以在C++ 14中实现,但如果在C++中可以简化这一点,我就会徘徊17.如果TTs编译器中找不到应该停止(static_assertion应该失败).

template<typename... Ts>
class A
{
  template<typename T>
  void action() {
    // check that T is also in Ts (static_assertion)
  }
}
Run Code Online (Sandbox Code Playgroud)

Bar*_*rry 6

我听说折叠表达是新的热点:

static_assert((std::is_same_v<T, Ts> || ...));
Run Code Online (Sandbox Code Playgroud)


Col*_*mbo 5

如果您更喜欢图书馆特质:

static_assert(std::disjunction_v<std::is_same<T, Ts>...>);
Run Code Online (Sandbox Code Playgroud)

请注意,这会导致短路(这里可能不是非常有益,但需要注意的事项).折叠表达同样可行:

static_assert((std::is_same_v<T, Ts> || ...));
Run Code Online (Sandbox Code Playgroud)

(从@Barry偷走.)