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> || ...));