【问题标题】:Boost lambda function call提升 lambda 函数调用
【发布时间】:2014-10-23 11:52:29
【问题描述】:

我正在学习 boost lambda(不是 c++0X lambda,因为我猜它们是不同的)。但是如果唯一的输入参数是调用对象,我无法在线找到调用成员函数(然后输出结果)的方法。我的意思是这条线有效:

for_each(vecCt.begin(), vecCt.end(), cout<<_1<<endl);

如果 vecCt 是 vectorint。但是,如果 vecCt 是 MyClassvector,它有一个名为 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);

【问题讨论】:

  • 定义不起作用。
  • @doctorlove 我假设你的意思是最后一行?它无法编译,错误是“'std::cout
  • 是的-我认为您只需要调用该函数... bind 是可调用的。添加()
  • @doctorlove 我在cout&lt;&lt; 之后添加了(,在; 之前添加了)。编译错误和我描述的一样。

标签: c++ boost boost-lambda


【解决方案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.hppboost/lambda/bind.hpp。此外,如果您收到 operator&lt;&lt; 消息,您可能仍在混合/匹配不同的命名空间。尝试使用我的确切代码,编辑它,直到你看到你的代码有什么不同
猜你喜欢
  • 2017-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
  • 1970-01-01
相关资源
最近更新 更多