如何编写一个可以迭代泛型类型的函数
How do I write a function that can iterate over a generic type
我想写一个类似下面描述的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;
}
现在你明白了为什么这个问题不是这个问题的重复。我觉得有一种类型安全的方法可以做到这一点,编译器确保迭代器迭代正确的类型。这就是为什么我不愿意接受Steve Lorimer的回答。
假设您有所需的重载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;
}
相关文章:
- 使用泛型类型推送到堆栈时出现问题
- 如何在容器中指定模板化别名的泛型类型
- 具有模板专用化的泛型类型转换
- C++存储泛型 T 类型类的向量
- 如何在C++中返回没有模板的泛型类型?
- 如何在带有约束 (C++) 的函数中使用泛型类型
- 模板函数重载(泛型类型与模板模板类型)选择正确的重载
- 泛型类型别名,它们彼此不兼容
- 泛型类型转换
- 重载泛型类型的模板类时检查运算符=时的自赋值
- 使用“decltype”获取迭代器的类型
- 在C++中,如何根据类中的参数返回不同的泛型类型
- C++错误 C2227:'->looseHealth'左侧必须指向类/结构/联合/泛型类型
- 使用泛型类型显式实例化函数模板
- 函数模板中的无效转换错误,返回值取决于其泛型类型
- 如何确保 "<<" 运算符适用于模板化 ADT 定义中的任何泛型类型?
- 仅当泛型类型的值是指针时,才删除该值
- 定义用于迭代不同容器类型的泛型转换迭代器
- 如何编写一个可以以类型安全的方式迭代泛型类型的函数
- 如何编写一个可以迭代泛型类型的函数