1. 程式人生 > >[C++]泛型程式設計的基礎問題

[C++]泛型程式設計的基礎問題

例如有一個 min 函式,我們希望它相對型別是獨立的,也就是說任何類/型別都可以呼叫這個函式。如果是一個整型的數,通常我們可以這樣寫:

int min(const int & a,const int &b)
{
    return a<b?a:b;
}

為了讓它適用於多個類,我們知道C++有函式模板機制,那麼就可以寫成下面的形式:

template <typename T>
const & T min(const T& a,const T &b)//這裡的返回值為 const &,這需要引數中也有 const & 或者有指標
{
    return a<b?a:b;
}

但是T類很可能沒有過載<符號,這樣就不泛型了,因為你總不可能要求別人或者你自己去一個個地把這些類的操作符都過載了。還有一個問題是有時候小於符號提供的功能,但不是我們想要的,例如我們想要比較字元,但是不區分大小寫,但是字元的小於卻是區分大小寫的。
針對這種問題,常見的解決方案是引數化操作符,其中又可分兩種,一種是傳函式指標,一種是傳函式物件。如果你感到陌生,看了下面兩個例子應該會明白:

template<typename Type,
         bool (*Comp)(const Type&,const Type&)>
         const Type &
                min(const Type& a,const Type& b)
{
       if(Comp(a,b)) return a;
       else return b;
}

函式指標的缺點,是其間接引用導致不能內聯,使用函式物件可以解決這一問題。

template<typename Type,
        typename Comp>
         const Type &
                min(const Type& a,const Type& b,Comp comp)
{
       if(comp(a,b)//這裡要求類過載了()操作符。
            return a;
       else 
            return b;
}

接下來馬上又要問的問題是,函式物件從哪裡來?一般來說有三種來源,預定義函式物件,預定義函式介面卡和自己定義的函式物件。

預定義函式物件被分為算術關係和邏輯操作,通過引用 functional 可以呼叫其中的類模板

#include <functional>