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

using methods with parameter(s) in void_t for SFINAE

本文关键字:方法 参数 void 用于 SFINAE      更新时间:2023-10-16

我正在尝试构建一个结构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<vector<int>>(失败。他们是在我的void_t中使用带参数的方法的一种方式吗?

您已经使用过一次declval来获取成员函数访问的内容。所以只要再次使用它来获得一个左值参数。

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