可以通过引用传递函数对象吗?

时间:2012-11-14 16:29:57

标签: c++

我有一段需要传递函数对象(功能)的代码。我不能使用函数指针,因为我需要存储一些状态变量。假设我有很多状态变量。可以通过引用传递函数对象吗?我只看过按值传递的函数对象。这就是我的代码:

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) {}
     .....
};

4 个答案:

答案 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是正确的但是......

  • 大多数情况下,您稍后会在代码中调用函数对象,因此您需要确保您在MyClass中提供的引用仍在范围内
  • 所以最后因为你需要保持堆栈中的函数对象而不是堆栈,所以你必须创建一个指向它的指针...所以我建议使用指针......

答案 3 :(得分:0)

函数对象是对象。您可以通过引用传递它们,并且可以存储对它们的引用,但要遵循通常的生命周期问题。但是,std::中的算法可以随时复制它们的函数对象,因此任何存储的状态都可能是陈旧的,因此最好将函数对象编写为指针或引用的包装器到它的州。