C++ 函数对象应该是函数参数还是它的引用?
我用下面的例子来说明我的问题:C++ 函数对象应该是函数参数还是它的引用?,c++,C++,我用下面的例子来说明我的问题: #include <boost/graph/adjacency_list.hpp> #include <iostream> #include <algorithm> class TestOperator { public: TestOperator(float k):k_(k){}; ~TestOperator() {}; float operator() (float m, float s)
#include <boost/graph/adjacency_list.hpp>
#include <iostream>
#include <algorithm>
class TestOperator
{
public:
TestOperator(float k):k_(k){};
~TestOperator() {};
float operator() (float m, float s)
{
return (1-k_)*m+k_*m*0.0078*s;
}
private:
float k_;
};
template<typename Operator>
void perform(Operator fun)
{
int value;
value = fun(3.1f,2.5f);
}
template<typename Operator>
void perform2(Operator &fun)
{
int value;
value = fun(3.1f,2.5f);
}
int main()
{
TestOperator myOperator(0.1f);
perform(myOperator);
perform2(myOperator);
return 0;
}
#包括
#包括
#包括。那么我的问题是:为什么不使用函数对象引用?对我来说,这更好。有什么想法吗 我的指导方针:
在大多数情况下使用操作员乐趣
仅当fun
具有不应从operaor()
的一次调用复制到下一次调用的数据时,才使用Operator&fun
。例如,如果使用操作符
收集它保存在容器中的数据,则有必要通过引用传递fun
。函数对象(或functor)的结构中包含成员,在通过值传递时将被复制,而在通过引用传递时不被复制
在您的示例中,成员k_将通过引用调用“生存”,如perform2。如果由于某种原因,函子中保留了信息,而没有初始化,这可能会产生奇怪的副作用
可以使用“按引用传递”来收集和保留函子中从一种用法到下一种用法的信息
如果按值传递,所使用的副本将在返回时蒸发,调用之间的信息将丢失
换句话说,原始的函子myOperator由perform更改,但由perform2更改
您可以提供一个常量myOperator来执行,但不能像声明的那样执行。如果您将perform2声明为接受常量&,它将不会编译,因为函子中的函数不是常量(不能保证不会更改函子中的内容)
谁“更好”还不知道。在某些情况下,一种比另一种更适用,复制更“安全”,适用范围更广(如果理论上较慢)。需要复制…传递值。不需要副本…通过引用传递。