Tim*_*ter 7 c++ templates iterator stl functor
给出适合std::for_each与朋友一起使用的仿函数:
template <typename T> struct Foo {
void operator()(T const& t) { ... }
};
std::for_each(v.begin(), v.end(), Foo<Bar>());
Run Code Online (Sandbox Code Playgroud)
有没有一些标准的方法将其转换为适合std::copy与朋友一起使用的输出迭代器?(或相反的改编)类似于:
std::copy(v.begin(), v.end(), functor_output_iterator(Foo<Bar>()));
Run Code Online (Sandbox Code Playgroud)
每次将值赋给迭代器时,都会调用仿函数:
adapter(F f) : functor(f) { }
adapter& operator*() { return *this; }
operator=(T const& t) { functor(t); }
operator++() { }
...
Run Code Online (Sandbox Code Playgroud)
或者,或者:
std::for_each(..., some_adapter(std::ostream_iterator(std::cout)));
Run Code Online (Sandbox Code Playgroud)
背景:
我有一个使用输出迭代器公开集合的类:
template <typename It> GetItems(It out) {
MutexGuard guard(mutex);
std::copy(items.begin(), items.end(), out);
}
Run Code Online (Sandbox Code Playgroud)
这允许调用者访问项目,而不必强制他们使用特定的容器类型,也不会弄乱锁定或其他内部细节.
例如,只获得独特的物品:
std::set<whatever> set;
obj->GetItems(std::inserter(set, set.end()));
Run Code Online (Sandbox Code Playgroud)
这打败了:
ObjLock lock = obj->GetLock();
for (int i = 0; i < obj->GetItemCount(); ++i) {
Item* item = obj->GetItem(i);
...
Run Code Online (Sandbox Code Playgroud)
现在我也希望能够聚合这些项目,而不是复制它们.(见这个问题).我通常会做的事情:
std::for_each(v.begin(), v.end(), Joiner<Foo>());
Run Code Online (Sandbox Code Playgroud)
现在我可以为相同的数据元素创建两个单独的方法,一个调用std::copy,一个调用,std::for_each但是能够定义一个这样的方法,使用迭代器或仿函数,并且让调用者能够传递它的函子或迭代器,根据需要调整它们到适当的类型.
我现在正在做的是以这样一种方式定义聚合器,它可以用作输出迭代器或仿函数,但这会导致不必要的复杂性.
| 归档时间: |
|
| 查看次数: |
2175 次 |
| 最近记录: |