【问题标题】:using methods with parameter(s) in void_t for SFINAE在 SFINAE 的 void_t 中使用带有参数的方法
【发布时间】:2020-11-01 21:02:45
【问题描述】:

我正在尝试构建一个结构 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 中使用带参数的方法的一种方式吗?

【问题讨论】:

    标签: c++ sfinae


    【解决方案1】:

    您已经使用过一次declval 来获取成员函数访问权限。所以只需再次使用它来获取左值参数。

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

    【讨论】:

    • 很好,它有效。对我来说仍然很难理解,但谢谢。
    猜你喜欢
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    相关资源
    最近更新 更多