简体   繁体   English

在 SFINAE 的 void_t 中使用带有参数的方法

[英]using methods with parameter(s) in void_t for SFINAE

I'm trying to build a struct is_container for using it on SFINAE template我正在尝试构建一个结构 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;

my problem is the swap function take a T& parameter and so static_assert(is_container_v<vector < int > >) failed.我的问题是交换 function 采用 T& 参数,因此 static_assert(is_container_v<vector < int >>) 失败。 Is their a way to use methods with parameters in my void_t?他们是在我的 void_t 中使用带参数的方法的一种方式吗?

You already used declval once to get something for a member function access.您已经使用过一次declval来获取成员 function 访问权限。 So just use it again to get an lvalue argument.所以只需再次使用它来获取左值参数。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM