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++巫术可以提供上述内容而无需提供额外的中间类?
没有适配器对象,您无法执行此操作.
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)
| 归档时间: |
|
| 查看次数: |
531 次 |
| 最近记录: |