gpt4 book ai didi

c++ - 如何使 C++ lambda 适应 back_inserter 等接收器接口(interface)

转载 作者:太空狗 更新时间:2023-10-29 23:46:57 26 4
gpt4 key购买 nike

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

例如我们目前可以做到以下几点:

std::vector<int> ilst;

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

如果像下面这样的事情是可能的呢?显然以下不会编译自动取款机:

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

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

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

最佳答案

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

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

如果您有一个采用 Y 的接口(interface),但您有一个 X,唯一调和的方法是引入一个将 X 转换为 Y 的 Z。

并且由于 X 和 Y 是对象,因此 Z 必须是提供 Y 接口(interface)的对象,但在内部将其转换为 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"; }));
}

关于c++ - 如何使 C++ lambda 适应 back_inserter 等接收器接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8018839/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com