【问题标题】:Calling a member function with member data by using for_each使用 for_each 调用具有成员数据的成员函数
【发布时间】:2011-05-11 15:34:19
【问题描述】:

亲爱的,我想为(比方说)同一个类的成员的向量的每个对象调用一个成员函数(需要一个引用),如以下代码所示:

#include <functional>  
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;

struct Stuff {
  double x;
};

class Test {
public:
  void f1(Stuff & thing);
  void f2(void);
  vector<Stuff> things;
};

void Test::f1(Stuff & thing) {
  ; // do nothing
}

void Test::f2(void) {
  for_each(things.begin(), things.end(), f1);
}

int main(void)
{

  return 0;
}  

这段代码给了我一个与未解决的重载函数类型相关的编译器错误。我也尝试过绑定,但似乎 f1 中所需的引用是一个问题。我知道我在这里遗漏了一些重要的东西,所以我借此机会解决我的问题并学习。目前,我无法安装 boost,但我也想知道 boost 是否有助于解决这个问题。提前致谢。

【问题讨论】:

    标签: c++ foreach reference pass-by-reference


    【解决方案1】:
    • 您要调用的函数不能简单地用f1标识,而应称为&amp;Test::f1(如:类Test的成员函数f1
    • 函数f1 不接受单个参数:作为任何非静态成员函数,它具有this 类型的隐式参数Test * const
    • 最后,标准绑定无法解决问题,因为它不处理通过引用传递的参数。

    Boost.Bind 确实是个不错的选择:

    std::for_each(things.begin(), things.end(), boost::bind(&Test::f1, this, _1));
    

    【讨论】:

    • 只是想补充一点,您也可以使用 C++11 的 std::bind(与 Boost.Bind 相同):std::for_each(things.begin(), things.end(), std::bind(&amp;Test::f1, this, std::placeholders::_1));
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多