Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: daniОтветов: 3

Я хочу проверить, что тип 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)
  }
}
  • Решение, на которое вы ссылаетесь, состоит из 5 строк. Насколько упрощения вы ищете? Sneftel 09.08.2017
  • Мой вопрос здесь было четыре рабочих строки, в ответе была только одна. Решения, которые вы найдете здесь для создания tuple из vector некоторых типов в пакете, длиннее 10 строк. Теперь это выполнимо в одном. dani 09.08.2017
  • @Sneftel, ну вот. один лайнер. dani 09.08.2017
  • Вот и я действительно иду. :) Sneftel 09.08.2017

c++c++17variadic-templates

Ответы

Ответ 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!")
  }
}

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы