2012-11-14 77 views
4

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

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

是的,这是完全正常的。请注意,函数对象的生命周期会超过引用它的生命周期。当然,这个建议并不是唯一的功能对象。 –

回答

4

按引用传递函数对象是好的,但你应该知道,许多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), ...) 

此外,一些库算法(例如transform)需要预先C++ 11的函数对象有无副作用即没有任何国家;这个要求很少被强制执行,并且在C++ 11中放宽了。

0

的synthax是正确的,但...

  • 大部分你打算以后要调用的函数对象在你的代码,所以你需要确保你参考中所提供的时间MyClass仍然在范围
  • 所以最后,因为你需要保持函数对象堆栈比堆栈,你必须创建一个指针...所以我建议使用指针..
0

函数对象是对象。您可以通过引用传递它们,并且可以存储对它们的引用,但要遵守通常的生命周期问题。但是,允许std::中的算法在他们喜欢的时候复制它们的函数对象,所以任何存储的状态都可能是陈旧的,所以最好将函数对象作为指针或对其状态的引用进行包装。

1

它主要取决于你打算如何创建函数对象(如何创建函数对象)。如果使用引用,则必须确保函数对象超过用户(MyClass)对象。

例如:

MyClass* createObject() { 
    MyFunction f(...);   // function object created 
    return new MyClass(f);  // reference used 
           // function object destroyed => reference invalid 
} 

不正确,因为返回的对象上的破坏(无效)函数的引用。

因为你获得通过引用传递非常少(避免复制一个小的物体),这是不值得(检查对象寿命)的麻烦和风险监督(BUG)

相关问题