【发布时间】:2012-11-12 19:23:44
【问题描述】:
我需要一个函数模板,它接受两个可能是指针的迭代器。如果这两个参数是 random_access 迭代器,我希望返回类型是
的对象std::iterator<random_access_iterator_tag, ...> 类型
还有一个
std::iterator<bidirectional_iterator_tag, ...> 类型。
我也希望代码拒绝 如果参数既不是双向迭代器也不是指针,则编译。我不能依赖第三方库,例如提升
你能帮我处理一下这个函数的签名,让它接受双向迭代器和指针,但不能说 input_iterator、output_iterator、forward_iterators。
我能想到的一个部分解决方案如下
template<class T>
T foo( T iter1, T iter2) {
const T tmp1 = reverse_iterator<T>(iter1);
const T tmp2 = reverse_iterator<T>(iter2);
// do something
}
这个想法是,如果它不是双向的,编译器不会让我从中构造一个 reverse_iterator。
【问题讨论】:
-
@PaulManta 是的,它必须基于 iterator_tags,但我似乎无法得到一个干净的解决方案。
-
不幸的是,C++ 元编程很少是干净的。你的编译器支持
enable_if吗? -
@PaulManta 是的,你是对的,我对模板很陌生。我得检查一下。我在 gcc 4.5 上,但代码需要合理“便携”和 C++-03
标签: c++ templates stl iterator