2012-11-14 78 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)

相關問題