我有一段需要传递函数对象(功能)的代码。我不能使用函数指针,因为我需要存储一些状态变量。假设我有很多状态变量。可以通过引用传递函数对象吗?我只看过按值传递的函数对象。这就是我的代码:
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) {}
.....
};
答案 0 :(得分:4)
通过引用传递函数对象很好,但是你应该知道许多C ++算法复制函数对象,所以如果你需要一个库算法来尊重你的状态,你应该将它作为参考传递< em> inside 你的函数对象:
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), ...)
此外,一些库算法(例如transform
)需要预先C ++ 11,函数对象没有副作用,即没有任何状态;这个要求很少被强制执行,并且在C ++ 11中被放宽了。
答案 1 :(得分:1)
它主要取决于您打算如何实现FunctionObject(如何创建函数对象)。如果使用引用,则必须确保函数对象超过用户(MyClass)对象。
例如:
MyClass* createObject() {
MyFunction f(...); // function object created
return new MyClass(f); // reference used
// function object destroyed => reference invalid
}
不正确,因为返回的对象具有对已销毁(无效)函数的引用。
由于你通过引用传递得很少(避免复制一个小对象),所以不值得麻烦(检查对象的生命周期)和风险监督(bug)
答案 2 :(得分:0)
synthax是正确的但是......
答案 3 :(得分:0)
函数对象是对象。您可以通过引用传递它们,并且可以存储对它们的引用,但要遵循通常的生命周期问题。但是,std::
中的算法可以随时复制它们的函数对象,因此任何存储的状态都可能是陈旧的,因此最好将函数对象编写为指针或引用的包装器到它的州。