我想检查类型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)
}
}
答案 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!")
}
}