1
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>

class A{
  public:
    A():n(4),d(6.6),f(2.7),s("hello my dear"){}
    ~A(){}
    void printAll()
    {
      std::cout << this->n << "\n" << this->d << "\n" << this->f << "\n" << this->s << "\n\n";
    }
  private:
    int n;
    double d;
    float f;
    std::string s;
};

int main(){
  std::vector<A*> v(100);
  //filling v ...
  std::for_each(v.begin(), v.end(), mem_fun_ref(&A*::printAll)); // this isn't supposed to work ?
  return(0);
}

我尝试了很多解决方案,这只是最后一个,这些都不起作用,我的目标是为 C++ 11 之前的 C++ 版本提供解决方案,所以我想避免使用 lambda(我也没有与 lambda 一起工作的问题,我的问题仅在于 for_each 循环)。

为了清晰和代码可读性,我想避免奇怪的绑定解决方案,这个解决方案也倾向于向程序添加 1 个库。

那么,当引用指向自定义类型的指针时,我如何才能简单地访问 for_each 循环中的方法?

谢谢。

4

3 回答 3

3

首先,由于你的向量包含指针,你需要std::mem_fun,而不是std::mem_fun_ref

其次,它std::mem_fun不仅仅是mem_fun

第三,指向成员的正确语法是&A::printAll,而不是&A*::printAll。那*在那儿做什么?

于 2012-10-27T20:09:00.537 回答
2

用于std::mem_fun创建带指针的函数对象。

或者std::mem_fn,如果您使用的是 C++11,则使用 if 生成一个函数对象,该函数对象采用指针、智能指针和引用。

std::for_each(v.begin(), v.end(), std::mem_fn(&A::printAll))
于 2012-10-27T20:10:14.727 回答
2

您的成员函数的地址是&A::printAll,不是&A::*printAll

std::for_each(v.begin(), v.end(), mem_fun_ref(&A*::printAll)); /
//                                              ^ error here - not need this *

也许你被定义指向成员函数类型的指针的语法误导了——这个星号是必要的:

typedef void (A*::PrintAll)();

[更新]
次要(或主要-正如我从您的评论中了解到的)问题是用于在对象指针上调用成员函数的错误函数-有关详细信息,请参见AndreyT答案

于 2012-10-27T20:05:37.137 回答