提升 lambda 函数调用
Posted
技术标签:
【中文标题】提升 lambda 函数调用【英文标题】:Boost lambda function call 【发布时间】:2014-10-23 11:52:29 【问题描述】:我正在学习 boost lambda(不是 c++0X lambda,因为我猜它们是不同的)。但是如果唯一的输入参数是调用对象,我无法在线找到调用成员函数(然后输出结果)的方法。我的意思是这条线有效:
for_each(vecCt.begin(), vecCt.end(), cout<<_1<<endl);
如果 vecCt 是 vector
的 int
。但是,如果 vecCt 是 MyClass
的 vector
,它有一个名为 getName
的函数来返回一个字符串怎么办?这都不是:
for_each(vecCt.begin(), vecCt.end(), cout<<_1->getName());
也不是这个:
for_each(vecCt.begin(), vecCt.end(), cout<<*_1.getName());
有效。
我在网上搜索,但很多结果建议在调用成员函数时使用bind。现在我知道了
for_each(vecCt.begin(), vecCt.end(), bind(&MyClass::getName, _1);
使我能够在每个传递 int 的对象上调用 getName
,但是如何将此输出传递给 cout?这不起作用:
for_each(vecCt.begin(), vecCt.end(), cout<<bind(&MyClass::.getName, _1);
【问题讨论】:
找到这个:***.com/questions/9762273/… 定义不起作用。 @doctorlove 我假设你的意思是最后一行?它无法编译,错误是“'std::cout 是的-我认为您只需要调用该函数... bind 是可调用的。添加()
@doctorlove 我在cout<<
之后添加了(
,在;
之前添加了)
。编译错误和我描述的一样。
【参考方案1】:
您很可能正在混合来自 boost::
、全局、boos::lambda
的占位符和函数(可能更多,例如 boost::phoenix
)。
这里是固定演示:Live On Coliru
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
struct X
int x;
std::string accessor() const return "X[" + std::to_string(x) + "]"; // I know, requires c++11
;
int main()
std::vector<X> v;
v.push_back( 1 );
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
std::for_each(v.begin(), v.end(),
std::cout << boost::lambda::bind(&X::accessor, boost::lambda::_1) << "\n");
【讨论】:
感谢您的回复。我只是收到错误“绑定不是 boost::lambda 的成员”(是错字吗,应该是 boost::bind 吗?)。我使用 c++ 编译,默认标准是 c++98。我也试过 c++0x 但同样的错误。如果我用 c++0x 尝试 boost::bind,编译错误是不同的:无法将 'std::ostream' 左值绑定到 'std::basic_ostream' (原始错误与 'operator 你复制了整个样本吗?如果是这样,您应该得到boost/boost/lambda.hpp
或boost/lambda/bind.hpp
。此外,如果您收到 operator<<
消息,您可能仍在混合/匹配不同的命名空间。尝试使用我的确切代码,编辑它,直到你看到你的代码有什么不同以上是关于提升 lambda 函数调用的主要内容,如果未能解决你的问题,请参考以下文章
从另一个未被调用的 Lambda 函数中调用 Lambda 函数
AWS lambda 调用不调用另一个 lambda 函数 - Node.js