我想编写如下print_all
所述的函数。
#include <iterator>
#include <vector>
template <typename V>
void print_all(std::iterator<std::input_iterator_tag, V> it) {
for (; it != std::end(it); ++it) {
V item = *it;
// do stuff with item
}
}
int main() {
std::vector<int> myvec (10);
print_all(myvec.cbegin());
return 0;
}
我如何声明print_all
它可以接受类型上的任何迭代器V
?
我想以类型安全的方式做到这一点。用例的一个更好的例子是累加器
#include <iterator>
#include <vector>
#include <functional>
template <typename V, typename K>
K accumulate(
std::function<K(K, V)> accumulator,
std::iterator<std::input_iterator_tag, V> it,
std::iterator<std::input_iterator_tag, V> end,
K initial) {
K sum = initial;
for (; it != end; ++it) {
V item = *it;
sum = accumulator(sum, item);
}
return sum;
}
现在您知道为什么这个问题不是this的重复。我觉得会有一种类型安全的方法来执行此操作,其中编译器确保迭代器迭代正确的类型。这就是为什么我不愿接受史蒂夫·洛里默的回答。
假设您具有必需的重载std::ostream
运算符,则只需将实际的迭代器作为函数模板的类型即可
template<typename IterT>
void print_all(IterT begin, IterT end)
{
while (begin != end)
std::cout << *begin++ << ", ";
std::cout << '\n';
}
如前所述,这仅在您具有必要的std::ostream& operator<<(...)
过载时才有效。
您可以这样称呼它:
int main()
{
std::vector<int> myvec;
// populate myvec...
print_all(std::begin(myvec), std::end(myvec));
return 0;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句