Проверка того, что тип шаблона T является частью пакета вариативных параметров в C++17

Я хочу проверить, что тип 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)
  }
}

person dani    schedule 09.08.2017    source источник
comment
Решение, на которое вы ссылаетесь, состоит из 5 строк. Насколько упрощения вы ищете?   -  person Sneftel    schedule 09.08.2017
comment
Мой вопрос здесь было четыре рабочих строки, в ответе была только одна. Решения, которые вы найдете здесь для создания tuple из vector некоторых типов в пакете, длиннее 10 строк. Теперь это выполнимо в одном.   -  person dani    schedule 09.08.2017
comment
@Sneftel, ну вот. один лайнер.   -  person dani    schedule 09.08.2017
comment
Вот и я действительно иду. :)   -  person Sneftel    schedule 09.08.2017


Ответы (3)


Я слышал, что складные выражения — это новая мода:

static_assert((std::is_same_v<T, Ts> || ...));
person Barry    schedule 09.08.2017

Если вы предпочитаете черту библиотеки:

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

Обратите внимание, что это выполняет короткое замыкание (возможно, здесь это не очень полезно, но об этом следует помнить). Выражения Fold одинаково жизнеспособны:

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

(Украдено у @Barry.)

person Columbo    schedule 09.08.2017

Достаточно просто на С++ с выражениями fold:

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