如何将C++lambdas适配到诸如back_inserter等人的接收器接口
How to adapt C++ lambdas to a sink interface such as back_inserter et al
我想知道在不必定义额外类的情况下,是否可以将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是不合适的。是这样吗?
相关文章:
- 如何使用默认参数等选择模板专业化
- 在Linux中哪里可以找到互斥、未来等的源代码
- 等<thing>效于char32_t
- 难以理解某些人解决IOI问题的源代码
- 使用 Clang++ 有没有办法将文件作为命名空间等包含?
- 具有多种约束(例如重量、体积等)的背包
- 最烦人的解析甚至更令人烦恼
- 我如何编写一个告诉星期几的程序?(泽勒全等)
- 以现代 CMake 方式控制包含的库中的构建选项(测试等)
- 如何将find_if与链表等非容器一起使用?
- 从 QFontDatabase 设置 QFont 将所有标签设置为等宽字体?Qt C++
- 如何正确使用QLayouts(hbox,vbox等)?
- 是否可以使用单个定义定义函数的常量和常规版本?(使用模板,自动,decltype等)
- 将字符串拆分为等长 c++ 的部分
- 如何通过按 F2 或 F3 等键使控制台打印某些内容
- 如何根据第二列/第三列等对字符串向量进行排序?
- DLSYM等人与共享库合作 - 仍然只是Dlopen
- 为什么 std::initializer_list 等人不存在 std::make_unique 重载?
- 如何将C++lambdas适配到诸如back_inserter等人的接收器接口
- Vazirani等人的动态规划中字符串的括号算法