如何将C++ lambda调整为接收器接口,例如back_inserter等

Jar*_*sie 2 c++ lambda adapter

我想知道是否可以在不必定义额外类的情况下,如果lambda可以适合作为接收器.

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

std::vector<int> ilst;

std::copy(ilst.begin(),ilst.end(),std::ostream_iterator<int>(std::cout,"\n"));
Run Code Online (Sandbox Code Playgroud)

如果可能出现以下内容怎么办?显然以下不会编译atm:

std::copy(ilst.begin(),ilst.end(),
          [](const int& i)
          {
             std::cout << i << "\n"; 
          });
Run Code Online (Sandbox Code Playgroud)

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

但是我想知道是否有某种C++巫术可以提供上述内容而无需提供额外的中间类?

Nic*_*las 9

没有适配器对象,您无法执行此操作.

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

如果你有一个接受Y的接口,但你有一个X,那么调和它的唯一方法是引入一个将X转换为Y的Z.

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

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


适用于这种特殊情况 - X是lambda,Y是输出迭代器,Z是function_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"; }));
}
Run Code Online (Sandbox Code Playgroud)

  • @JaredKrumsie:你问,“但是我想知道是否有某种 C++ 巫术可以在不需要提供额外的中间类的情况下实现上述功能?” 我回答说:“你使用的‘C++ voodoo’被称为适配器对象,它将一个接口转换为另一个接口。这不仅是正确的解决方案,而且是_唯一_的解决方案。” 你当然可以选择不相信这个答案。但这不会让它变得不那么真实;) (2认同)