如何将C++lambdas适配到诸如back_inserter等人的接收器接口

How to adapt C++ lambdas to a sink interface such as back_inserter et al

本文关键字:inserter 等人 接口 接收器 back C++lambdas      更新时间:2023-10-16

我想知道在不必定义额外类的情况下,是否可以将lambda调整为接收器。

例如,我们目前可以做以下操作:

std::vector<int> ilst;
std::copy(ilst.begin(),ilst.end(),std::ostream_iterator<int>(std::cout,"n"));

如果下面这样的事情可能发生呢?显然以下习惯编译atm:

std::copy(ilst.begin(),ilst.end(),
          [](const int& i)
          {
             std::cout << i << "n"; 
          });

我已经能够解决这个问题,通过定义一个函数对象来实现解引用和函数运算符,并将lambda作为谓词。

然而,我想知道是否有某种C++voodoo可以在不需要提供额外中介类的情况下实现上述功能?

如果没有适配器对象,就无法执行此操作。

std::copy采用符合标准库输出迭代器要求的输出迭代程序。lambda函数是一个具有operator()的对象,该对象接受某些参数并返回一个值。这是两种不同的东西。

如果你有一个接受Y的接口,但你有一台X,唯一的方法是引入一个将X转换为Y的Z。

由于X和Y是对象,因此Z必须是一个提供Y接口的对象,但在内部将其转换为X。Z通常被称为适配器对象。

没有其他"C++voodoo"可以改变这一点。没有"其他解决方案"。必须使用某种适配器。无论是类类型的临时函数还是返回类实例的函数,这都只能通过适配器对象来解决。


应用于这种特殊情况-X是lambda,Y是输出迭代器,Z是函数output_iterator:

#include <boost/function_output_iterator.hpp>
#include <boost/range/algorithm/copy.hpp>
#include <iostream>
#include <vector>
int main()
{
    std::vector<int> ilst;
    boost::copy(
        ilst,
        boost::make_function_output_iterator(
            [](int i) { std::cout << i << "n"; }));
}

这会达到您的预期吗?

std::for_each(ilst.begin(),ilst.end(),
          [](const int& i)
          {
             std::cout << i << "n"; 
          });

我怀疑这个例子是对更复杂的东西的替代,其中for_each是不合适的。是这样吗?