怎么才能输出 functor 内的成员变量?

怎么才能输出 functor 内的成员变量?

原标题:怎么才能输出 functor 内的成员变量?

关键字:C++,仿函数

最佳回答:573xmcgcg

回答字数:230字

因为 for_each 的第三个参数的并不是【函数对象的引用】,也就是说 for_each 只是在操作【fm的副本】而已,实际上并没有改变 fm 本身的状态。你需要做的就是在 for_each 那一句开头加上【fm=】,这样副本被更改后的状态就可以保存到 fm 上。

本文链接:

联系作者

回答作者:573xmcgcg

0

评论0

  1. 楼上说得对,std::for_each 的最后一个参数是传值的,你这个 FindMax 每次都被构造了一次。解决方案也很简单,手动修改 for_each 的模板参数就行……

    for_each(elems, elems + ArraySize, fm);

    修改成

    for_each<decltype(elems), decltype(fm)&>(elems, elems + ArraySize, fm);

    手动添加一个引用就行。

    但这个如果 for_each 内部对 fm 做了某些操作,比如 move 之后,可能就失效了。一个更好的方法是把 max 做成引用,这样不管它是 copy 还是 move,都会指向原来那个值。当然这个时候就不能用 INT_MAX 初始化了,它就一字面量。应该开辟一个 int int_max = INT_MAX;

    其实为了贯彻 functor 思想,还可以再套一层闭包(其实 functor 就是闭包嘛,只不过有个直接调用的语法糖)就行了——搞一个 GenFindMax,把 max 的实际值存储在 GenFindMax 里面,GenFindMax 每次调用生成一个 FindMax,其中存了一个对 GenFindMax 里 max 的引用。不过这么搞意义不明……具体写法如下:

    #include <iostream>#include <algorithm>#include <ctime>#include <climits>using namespace std;#define ArraySize 1024struct FindMax{  int &max;  FindMax(int &rMaxVal): max(rMaxVal) {}  void operator()(int x)  {    if(x > max)    {      max = x;    }  }};struct GenFindMax {  int max;  GenFindMax(int maxVal): max(maxVal) {}  FindMax operator()() {    return FindMax(max);  }};int main(){  int* elems = new int[ArraySize];  srand((unsigned int)time(nullptr));  for(int i = 0; i < ArraySize; i++)  {    elems[i] = rand() % 2000;  }  GenFindMax fm = GenFindMax(INT_MIN);  for_each(elems, elems + ArraySize, fm());  cout << fm().max << endl;  return 0;}

    执行

    % g++ -o closure closure.cpp && ./closure1997

    说起来感觉算这个值的期望很有意思……

    hjl4am 2023-09-26 0 回复
没有账号?注册  忘记密码?