函数对象应该是函数实参还是它的引用?
Should function object be an function argument or its reference?
我用下面的例子来说明我的问题:
#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;
}
在perform
中我们使用函数对象作为函数参数,而在perform2
中我们使用函数对象引用作为函数参数。在关于函数对象的教程中,前者的用法占主导地位,就像本教程中的函数对象一样。那么我的问题是:为什么不使用函数对象引用?对我来说,这更好。什么好主意吗?
结构中有成员的函数对象(或functors)在按值传递时将被复制,而在按引用传递时不被复制。
在您的示例中,成员k_将通过引用调用"存活",如在perform2中。如果由于某种原因在函子中保留了信息而没有初始化,这可能会产生奇怪的副作用。
可以使用引用传递方法从一次使用到下一次使用来收集和保留函子内的信息。
如果按值传递,使用的副本将在返回时消失,并且调用之间的信息丢失。
换句话说,原来的函子myOperator没有被perform改变,但被perform2改变了。
可以提供const myOperator来执行,但不能像声明的那样提供perform2。如果将perform2声明为接受const &,它将无法编译,因为函数函数中的函数不是const(不能保证不改变函数函数中的内容)。
哪个"更好"是未知的。在某些情况下,一个比另一个更适用,复制更"安全",更广泛适用,如果理论上较慢的话。
我的指导方针:
一般使用Operator fun
仅当fun
的数据不能从operaor()
的一次调用复制到下一次调用时才使用Operator& fun
。例如,如果使用Operator
收集它在容器中保存的数据,则必须通过引用传递fun
。
相关文章:
- 区分接受常量参数的函数引用/指针和与函数参数同名的非常量参数
- 类 Referention 中C++回调函数引用非静态函数
- 使用函数引用指向节点的指针删除链表中的节点?
- 解释通过从函数引用返回数组的语法
- "Class1"类"Class2"对象作为私有数据成员。如何通过"Class 2"函数引用"Class1"对象?
- 使用默认构造函数引用成员变量初始化错误
- 无法调用函数引用 c++
- 使用 decltype(this) 获取函数引用
- 我应该如何定义返回指针的函数?(引用指针与指针指针)
- 从内联函数引用文件静态变量
- Boost::将sigaction函数引用绑定到实例
- 一种比函数引用更有效的方法
- 奇怪的未定义函数引用,函数调用C++不存在
- 是否可以检测绑定成员函数引用的对象是否被删除或销毁
- 构造函数引用参数导致seg错误
- 是否可以使函数模板从函数引用中获取“decltype”
- 无法让 Lua 函数引用"self"
- 如何解析变量和函数引用(Linker & Compiler)?
- 从不同模块调用函数 - 引用错误
- 如何在主函数中连接到数据库,然后从其他函数引用它