Это точный дубликат этого вопроса, за исключением того, что принятый ответ неверен, поэтому я снова спрашиваю его:
Как вы правильно проверяете, является ли данный тип 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 С++ происходит сбой:
...\vc\include\xutility(373)
:
ошибка C2039:'iterator_category'
: не является членом'Foo'
потому что iterator_traits
ищет определение value_type
в Foo
, которое (очевидно) не существует.
I am знает, что __if_exists
является возможностью на Visual С++, но я ищу портативное решение.