我有一个模板函数,需要专门用于迭代器。所以我所做的就是沿着线:std :: iterator_traits微软标准库中的整型类型
template <typename T>
void function2(T whatever, typename std::iterator_traits<T>::pointer) // ... iterator
template <typename T>
void function2(T whatever, ...) // ... non-iterator
template <typename T>
void function(T whatever) {
function2(whatever, NULL);
}
而且我碰了壁,因为微软标准库专门std::iterator_traits
所有数值类型(bool
,char
,int
,float
...)。并且它这样做使得reference
和pointer
不是void
,尽管这些类型都不能调用operator*
和operator->
。
好的,我可以检查std::iterator_traits<T>::category
派生std::input_iterator
(实际上我认为std::forward_iterator
更适合于我的情况),但需要花费一些更复杂的模板机器。
我不过是想知道:
- 为什么他们定义为
iterator_traits
类型,不符合的迭代器概念(即使输出迭代至少需要一元operator*
,没有这些类型的有一个 - 他们违反了C++规范吗?不是微软不会违反它,但如果他们是我会满足特定于编译器的解决方法,如果他们不明显不是。
- 无论如何它是可行的吗?它看起来是
std::iterator_traits<T>::pointer
总是存在,但未定义,并导致错误,而不是SFINAE。
另外:你的代码是无效的C++(但MSVC会接受它),你需要用'typename'标记依赖名'std :: iterator_traits :: pointer'。 –
2013-02-12 10:45:55
@KonradRudolph:谢谢。我实际上在msvC++和gcc 4.5和4.6中编译,所以我需要在那里,但它不是复制粘贴;实际的代码需要一个专门处理某些事情的模板,我正在检查这个事情是否是迭代器。 – 2013-02-12 11:42:46