这是这个问题的完全重复,除了接受的答案是错误的,所以我再问一遍:
如何正确检查给定类型T
是否为迭代器?
我尝试解决它:
// Assume enable_if and is_same are defined
// (hoping for a solution that works for C++03 too)
template<class T>
class is_iterator
{
static char (&test(...))[2];
template<class U>
static typename std::enable_if<
!std::is_same<
typename std::iterator_traits<T>::value_type,
void
>::value,
char
>::type test(U);
public:
static bool const value = sizeof(test(0)) == 1;
};
struct Foo { };
int main()
{
return is_iterator<Foo>::value;
}
在 Visual C++ 上碰巧失败了:
...\vc\include\xutility(373)
:
错误 C2039:'iterator_category'
: 不是'Foo'
因为iterator_traits
正在寻找value_type
in的定义Foo
,(显然)不存在。
我知道这在 Visual C++ 上是__if_exists
一种可能性,但我正在寻找一种可移植的解决方案。