【发布时间】:2012-08-15 11:52:20
【问题描述】:
这是this question 的完全相同的副本,除了接受的答案是错误的,所以我再问一遍:
您如何正确检查给定类型 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 正在Foo 中寻找value_type 的定义,而该定义(显然)不存在。
我我知道 __if_exists 在 Visual C++ 上是一种可能性,但我正在寻找一种可移植的解决方案。
【问题讨论】:
-
另外,链接的问题早于 C++11,并且有更好的编译时反射支持。