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

时间:2017-08-09 15:15:48

标签: c++ variadic-templates c++17

我想检查类型T是否也是参数包Ts的一部分。有solutions在C ++ 14中有这样做,但如果可以在C ++中简化,那我就会徘徊17。如果在T中找不到Ts,则编译器应该停止(static_assertion应该失败)。

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

3 个答案:

答案 0 :(得分:6)

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

static_assert((std::is_same_v<T, Ts> || ...));

答案 1 :(得分:5)

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

static_assert(std::disjunction_v<std::is_same<T, Ts>...>);

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

static_assert((std::is_same_v<T, Ts> || ...));

(从@Barry偷走。)

答案 2 :(得分:0)

使用折叠表达式在C ++中足够简单:

template<typename... Ts>
class A
{
  template<typename T>
  void action() {
    static_assert((... || std::is_same_v<T, Ts>)), "Not!")
  }
}