函数可以具有多个成员函数吗?

时间:2019-04-06 20:22:06

标签: c++

我的想法是创建一种方法来计算使用给定运算符(在本例中为+)的次数。

所以我想出了以下函子:

#include <iostream>
#include <functional>
#include <algorithm>

template <class T> class plus {
    private:
        unsigned int num_of_calls;
    public:
        plus(): num_of_calls(0) {};

        T operator() (const T& x, const T& y){
            num_of_calls++;
            return x+y;
        }

        unsigned int get_num_of_calls(){
            return num_of_calls;
        }
};


int main () {
  int first[]={1,2,3,4,5};
  int second[]={10,20,30,40,50};
  int results[5];

  plus<int> plus_operator;

  std::transform (first, first+5, second, results, plus_operator);
  for (int i=0; i<5; i++) std::cout << results[i] << ' ';
  std::cout << std::endl<<std::endl;

  std::cout<< "Number of calls: "<<std::endl;
  std::cout<<plus_operator.get_num_of_calls()<<std::endl;


  return 0;
}

它很好地将元素添加在一起,但是当我调用get_num_of_calls()函数时,它返回0,就像新初始化的函子一样。但是,如果我在num_of_calls运算符中打印()的实际值,则可以正常工作。

是什么原因导致这种行为?除()运算符之外,函子还可以具有其他成员函数吗?

1 个答案:

答案 0 :(得分:4)

调用std::transform时,您正在传递对象的副本。您应该使用std::ref传递引用,或改用lambda:

std::transform (first, first+5, second, results, [&](const auto lhs, const auto rhs) { 
    plus_operator(lhs, rhs); 
});

或者:

std::transform (first, first+5, second, results, std::ref(plus_operator));