Я хочу проверить, что тип T также является частью пакета параметров Ts. Есть решения, которые делают это в С++ 14, но я не знаю, можно ли это упростить в С++ 17. Если T не найдено в Ts, компилятор должен остановиться (статическое_утверждение должно завершиться ошибкой).
template<typename... Ts>
class A
{
template<typename T>
void action() {
// check that T is also in Ts (static_assertion)
}
}
Ответ 1 · рейтинг 6 · Barry
Я слышал, что складные выражения - это новая мода:
static_assert((std::is_same_v<T, Ts> || ...));
Ответ 2 · рейтинг 5 · Columbo
Если вы предпочитаете черту библиотеки:
static_assert(std::disjunction_v<std::is_same<T, Ts>...>);
Обратите внимание, что это выполняет короткое замыкание (возможно, здесь это не очень полезно, но об этом следует помнить). Выражения Fold одинаково жизнеспособны:
static_assert((std::is_same_v<T, Ts> || ...));
(Украдено у @Barry.)
Ответ 3 · SergeyA
Достаточно просто на С++ с выражениями fold:
template<typename... Ts>
class A
{
template<typename T>
void action() {
static_assert((... || std::is_same_v<T, Ts>)), "Not!")
}
}