C++ 通过引用传递函数对象可以吗?
我有一段代码需要传递一个函数对象(functional)。我不能使用函数指针,因为我需要存储一些状态变量。假设我有很多状态变量。通过引用传递函数对象可以吗?我只见过按值传递的函数对象。这就是我的代码的样子:C++ 通过引用传递函数对象可以吗?,c++,C++,我有一段代码需要传递一个函数对象(functional)。我不能使用函数指针,因为我需要存储一些状态变量。假设我有很多状态变量。通过引用传递函数对象可以吗?我只见过按值传递的函数对象。这就是我的代码的样子: struct FunctionObject { double a, b, x, y; double operator() (int v, int w) {....} }; template <class T> Class MyClass { T&
struct FunctionObject {
double a, b, x, y;
double operator() (int v, int w) {....}
};
template <class T>
Class MyClass {
T& func;
.....
public:
MyClass(T& func):func(func) {}
.....
};
struct FunctionObject{
双a,b,x,y;
双运算符()
};
模板
类MyClass{
T&func;
.....
公众:
MyClass(T&func):func(func){}
.....
};
< /代码> 通过引用传递函数对象是很好的,但是您应该知道许多C++算法复制函数对象,因此如果需要一个库算法来尊重您的状态,则应该将其作为函数对象内的引用传递:
struct State {
double a, b, x, y;
};
struct Function {
State &state;
explicit Function(State &state): state(state) {}
double operator() (int v, int w) {....}
};
State state;
std::...(..., Function(state), ...)
此外,一些库算法(例如)要求C++11之前的函数对象没有任何副作用,即没有任何状态;这个要求很少被强制执行,在C++11中被放宽了。synthax是正确的,但是
- 大多数情况下,您将在稍后的代码中调用函数对象,因此您需要确保在MyClass中提供的引用仍在范围内
- 因此,由于最终需要将函数对象保留在堆中而不是堆栈中,因此必须创建指向它的指针。。。所以我建议使用指针
函数对象是对象。您可以通过引用传递它们,也可以根据通常的生存期问题存储对它们的引用。但是,std::
中的算法允许随时复制其函数对象,因此任何存储状态都可能过时,因此最好将函数对象作为指针或其状态引用的包装来编写。这主要取决于您打算如何实例化FunctionObject(如何创建函数对象)。如果使用引用,则必须确保函数对象比用户(MyClass)对象寿命长
例如:
MyClass* createObject() {
MyFunction f(...); // function object created
return new MyClass(f); // reference used
// function object destroyed => reference invalid
}
不正确,因为返回的对象具有对已销毁(无效)函数的引用
由于通过引用传递(避免复制一个小对象)所获得的收益很少,因此不值得费事(检查对象的生命周期)和疏忽风险(bug)是的,这很好。只是要小心,函数对象的生存期超过了引用它的生存期。当然,这个建议不是函数对象独有的。