假设我有std::array<SomeType, N>
并且我想调用一个函数,该函数使用迭代器来处理std::array
中的对象,但不知道容器是std::array
。
SomeType是一个具有公共成员函数doSomething()
的类例如,函数可能是:
template<typename Iterator>
void action(Iterator &beg, Iterator &end) {
for (; beg != end; ++beg)
beg->doSomething();
}
可以通过以下方式调用此功能:
int main() {
std::array<SomeType, 10> a;
action<std::array<SomeType, 10>::iterator>(a.begin(), a.end());
}
但我想知道这是不是这样做的?特别是因为模板可以用于每个类。有没有办法将函数限制为SomeType
而不让函数知道容器是std::array
?
答案 0 :(得分:5)
修复您的代码:您不应该要求左值参数。实际上,迭代器应该是可以有效复制的。
@@PROCID
让模板参数推断完成它的工作:
template<typename Iterator>
void action(Iterator beg, Iterator end)
// ^^^^^^^^^^^^ ^^^^^^^^^^^^
答案 1 :(得分:0)
请注意,标准库已经有许多算法,涵盖了“在某个容器中在某个范围内执行相同操作”的一般情况:
#include <array>
#include <vector>
#include <algorithm>
#include <numeric>
#include <iterator>
struct SomeType
{
void doSomething();
SomeType mutatedCopy() const;
int someValue() const;
};
int add_value(int i, const SomeType& st) {
return i + st.someValue();
}
void call_something(SomeType& st) { st.doSomething(); }
auto mutate_copy(SomeType const& st) { return st.mutatedCopy(); }
int main() {
std::array<SomeType, 10> a;
std::vector<SomeType> b;
std::for_each(a.begin(), a.end(), call_something);
std::for_each(b.begin(), b.end(), call_something);
std::transform(a.begin(), a.end(), a.begin(), mutate_copy);
std::transform(b.begin(), b.end(), b.begin(), mutate_copy);
auto tot = std::accumulate(a.begin(), a.end(), 0, add_value)
+ std::accumulate(b.begin(), b.end(), 0, add_value);
// you can even transform into dissimilar containers:
std::transform(a.begin(), a.end(), std::back_inserter(b), mutate_copy);
}