c++ SFINAE - 检查 class 有 typedef,为什么需要 void_t?
c++ SFINAE - checking class has typedef, why is void_t required?
template <class T> struct has_iterator_typedefs
{
private:
struct __two {char dummy[2];};
template <class U> static __two test( ... );
template <class U> static char test( typename __void_t<typename U::iterator_category>::type* = NULL, //NOTE: require __void_t , == NULL ?
typename __void_t<typename U::difference_type>::type* = NULL,
typename __void_t<typename U::value_type>::type* = NULL,
typename __void_t<typename U::reference>::type* = NULL,
typename __void_t<typename U::pointer>::type* = NULL);
public:
static const bool value = sizeof(test<T>(0,0,0,0,0)) == 1;
};
这是 libc++ 代码的一部分。
我了解 void_t 是如何工作的,但我不知道为什么在上下文中需要它。
为什么 SFINAE 在没有 void_t 的情况下无法工作,例如 typename U::iterator_category*
?
+) 我认为它确实有效 w/o 默认参数 = NULL
,它是必需的吗?
你不能有指向引用的指针
using X = int&;
using T = X*; // fail
所以至少 U::reference*
很可能会失败。
我不认为 NULL
真的有必要,因为调用者确实提供了所有的值。
注意:我假设 __void_t
与 std::void_t
相同
template <class T> struct has_iterator_typedefs
{
private:
struct __two {char dummy[2];};
template <class U> static __two test( ... );
template <class U> static char test( typename __void_t<typename U::iterator_category>::type* = NULL, //NOTE: require __void_t , == NULL ?
typename __void_t<typename U::difference_type>::type* = NULL,
typename __void_t<typename U::value_type>::type* = NULL,
typename __void_t<typename U::reference>::type* = NULL,
typename __void_t<typename U::pointer>::type* = NULL);
public:
static const bool value = sizeof(test<T>(0,0,0,0,0)) == 1;
};
这是 libc++ 代码的一部分。 我了解 void_t 是如何工作的,但我不知道为什么在上下文中需要它。
为什么 SFINAE 在没有 void_t 的情况下无法工作,例如 typename U::iterator_category*
?
+) 我认为它确实有效 w/o 默认参数 = NULL
,它是必需的吗?
你不能有指向引用的指针
using X = int&;
using T = X*; // fail
所以至少 U::reference*
很可能会失败。
我不认为 NULL
真的有必要,因为调用者确实提供了所有的值。
注意:我假设 __void_t
与 std::void_t