использование методов с параметром (ами) в void_t для SFINAE - PullRequest
1 голос
/ 12 июля 2020

Я пытаюсь создать struct is_container для использования его в шаблоне SFINAE

  template<typename T, typename = void>
  struct is_container : std::false_type {};

  template<typename T>
  struct is_container<
    T,
    std::void_t<
      typename T::value_type,
      typename T::reference,
      typename T::const_reference,
      typename T::iterator,
      typename T::const_iterator,
      typename T::difference_type,
      typename T::size_type,

      decltype(std::declval<T>().begin()),
      decltype(std::declval<T>().end()),
      decltype(std::declval<T>().cbegin()),
      decltype(std::declval<T>().cend()) ,

      decltype(std::declval<T>().size()),
      decltype(std::declval<T>().max_size()),
      decltype(std::declval<T>().empty()),
      decltype(std::declval<T>().swap()) //<------ problem here
      >
    > : public std::true_type {};

  template<typename T>
  inline constexpr bool is_container_v = is_container<T>::value;

моя проблема в том, что функция подкачки принимает параметр T &, поэтому static_assert (is_container_v >) не удалось. Есть ли у них способ использовать методы с параметрами в моем void_t?

1 Ответ

3 голосов
/ 12 июля 2020

Вы уже использовали declval один раз, чтобы получить что-то для доступа к функции-члену. Так что просто используйте его снова, чтобы получить аргумент lvalue.

decltype(std::declval<T>().swap(std::declval<T&>()))
...