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

C++ 检查模板类型T是否是C+中可变参数包的一部分+;17,c++,variadic-templates,c++17,C++,Variadic Templates,C++17,我想检查类型T是否也是参数包Ts的一部分。在C++14中有这样做的方法,但我不知道这是否可以在C++17中简化。如果在Ts中未找到T,编译器应停止(静态_断言应失败) 模板 甲级 { 模板 无效行动(){ //检查T是否也在Ts中(静态_断言) } } 我听说折叠表达式是新的热点: static_assert((std::is_same_v<T, Ts> || ...)); static_断言((std::is_same_v| | |…); > p>具有C++表达式的简单表达式:

我想检查类型
T
是否也是参数包
Ts
的一部分。在C++14中有这样做的方法,但我不知道这是否可以在C++17中简化。如果在
Ts
中未找到
T
,编译器应停止(静态_断言应失败)

模板
甲级
{
模板
无效行动(){
//检查T是否也在Ts中(静态_断言)
}
}

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

static_assert((std::is_same_v<T, Ts> || ...));
static_断言((std::is_same_v| | |…);

> p>具有C++表达式的简单表达式:

template<typename... Ts>
class A
{
  template<typename T>
  void action() {
    static_assert((... || std::is_same_v<T, Ts>)), "Not!")
  }
}
模板
甲级
{
模板
无效行动(){
静态断言((…| | std::is_same_v)),“Not!”)
}
}

如果您喜欢库特征:

static_assert(std::disjunction_v<std::is_same<T, Ts>...>);
static_断言(std::disjunction_v);
请注意,这执行短路(这里可能不是非常有益,但要记住)。折叠表达式同样可行:

static_assert((std::is_same_v<T, Ts> || ...));
static_断言((std::is_same_v| | |…);

(从@Barry偷来。)

您链接到的解决方案有5行。你希望简化多少?我的问题有四条工作线,答案只有一条。在这里,您可以找到一些解决方案,用于在一个包中创建一个
向量
元组
,其中某些类型的长度超过10行。“现在一次就可以了。”斯奈夫特尔,你来了。一行。我真的走了。:)
static_assert((std::is_same_v<T, Ts> || ...));