Effective STL 學習筆記 Item 38 : Design functor classes for pass-by-value

嚴格來說, C 和 C++ 都不支持將函數做爲參數,真正做爲參數的,其實是 pass-by-value 的函數指針, 做爲函數指針的模擬, Functor 做爲參數時候也是按值傳遞的,有些 STL 的實現中,將 Functor 做爲引用傳遞甚至不能經過編譯。這也就要求咱們將 Functor 設計得當,以知足傳值: css

  1. Functor 應該儘可能小:
    不然的話, Functor 的拷貝將會變得昂貴。
  2. 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! 算法

相關文章
相關標籤/搜索