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

Checking that a template type T is part of a variadic parameter pack in C++17

本文关键字:变参 参数 一部分 C++17 类型 是否 检查      更新时间:2023-10-16

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

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

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

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

如果您更喜欢库特征:

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

请注意,这会执行短路(也许在这里不是非常有益,但要记住一些事情(。折叠表达式同样可行:

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

(从@Barry偷来的。

在C++使用折叠表达式时很容易:

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