嚴格來說, C 和 C++ 都不支持將函數做爲參數,真正做爲參數的,其實是 pass-by-value 的函數指針, 做爲函數指針的模擬, Functor 做爲參數時候也是按值傳遞的,有些 STL 的實現中,將 Functor 做爲引用傳遞甚至不能經過編譯。這也就要求咱們將 Functor 設計得當,以知足傳值: css
- Functor 應該儘可能小:
不然的話, Functor 的拷貝將會變得昂貴。 - Functor 應該爲單態 (monomorphic): —— 不用使用虛函數
若是算法須要的是基類 Functor,但傳入的是子類的話,拷貝過程當中可能會引發 切片問題 。
但,離開了多態與繼承的 C++ ,也就失去了後面的 ++, 變成了 C 。這裏有一個辦法能夠將龐大的多態 Functor 分解成符合需求的 Functor,即將數據以及多態的部分封裝成單獨的類,而後在 Functor 中存儲該類的指針,換句話說: Bridge Mode。 html
例以下面的這個 BPFC (Big Polymoriphic Functor Class): java
template <typename T> class BPFC : public unary_functor<T, void>() { public: // XXX: This is virtual function, may cause slicing issue. virtual void operator()(const T& val) const; private: Widget w; int x; };
咱們能夠將其中的數據和多態部分拆分,造成下面的 Functor: c++
template <typename T> class BPFCImpl { public: virtual void operator(const T& val) const; virtual ~BPFCImpl(); private: Widget w; int x; }; template <typename T> class BPFC : public unary_functor<T,void> { public: void operator()(const T& val) const { pImpl->operator(val); // forward it to BPFCImpl } private: BPFCImpl<T>* pImpl; };
切記: Make functors small and monomorphic! 算法