我的想法是创建一种方法来计算使用给定运算符(在本例中为+)的次数。
所以我想出了以下函子:
#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
运算符中打印()
的实际值,则可以正常工作。
是什么原因导致这种行为?除()
运算符之外,函子还可以具有其他成员函数吗?
答案 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));