C++ 仿函数输出迭代器适配器

标签 c++ templates stl iterator functor

给定一个适合与 std::for_each 和 friend 一起使用的仿函数:

template <typename T> struct Foo {
    void operator()(T const& t) { ... }
};

std::for_each(v.begin(), v.end(), Foo<Bar>());

是否有一些标准方法可以将其转换为适合与 std::copy 和 friend 一起使用的输出迭代器? (或相反的改编)类似于:

std::copy(v.begin(), v.end(), functor_output_iterator(Foo<Bar>()));

每次给迭代器赋值时都会调用仿函数:

adapter(F f) : functor(f) { }
adapter& operator*()  { return *this; }
operator=(T const& t) { functor(t); }
operator++()          { }
...

或者,或者:

std::for_each(..., some_adapter(std::ostream_iterator(std::cout)));

背景:

我有一个使用输出迭代器公开集合的类:

template <typename It> GetItems(It out) {
    MutexGuard guard(mutex);
    std::copy(items.begin(), items.end(), out);
}

这允许调用者访问项目,而无需强制他们使用特定的容器类型,也不会弄乱锁定或其他内部细节。

例如,只获取唯一的项目:

std::set<whatever> set;
obj->GetItems(std::inserter(set, set.end()));

这真是太棒了:

ObjLock lock = obj->GetLock();
for (int i = 0; i < obj->GetItemCount(); ++i) {
    Item* item = obj->GetItem(i);
    ...

现在我也希望能够聚合这些项目,而不是复制它们。 (参见 this question)。我通常会做类似的事情:

std::for_each(v.begin(), v.end(), Joiner<Foo>());

现在我可以为相同的数据元素制作两种不同的方法,一种调用 std::copy ,另一种调用 std::for_each 但这会很好能够只定义一个这样的方法,使用迭代器或仿函数,并让调用者能够将仿函数或迭代器传递给它,根据需要调整它们以适应适当的类型。

我现在正在做的是定义聚合器,使其可以用作输出迭代器或仿函数,但这会导致不必要的复杂性。

最佳答案

关于C++ 仿函数输出迭代器适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2218889/

相关文章:

c++ - C++如何对右值引用进行模板推导?

C++使用对象的优先级队列

c++ - 在 C++11 中使用的前向声明

c++ - std::tuple 中的括号和大括号有什么区别?

c++ - 在笛卡尔坐标和屏幕坐标之间转换

c++ - 如何使用可变模板参数保存可变数量的参数?

c++ - 在图中使用迭代器时出错

c++ - 如何获取在 Main.cpp 中声明的全局变量以便在 header 中访问

android - 使用 FAAC 编码为 m4a 的 RAW PCM 数据无法识别?

c++ - 使用多个输入 vector 中值的笛卡尔积调用 lambda