C++模版:偏特化和函數模版的小技巧

偏特化就是部分特化。
利用模版的偏特化,能夠實現一些類型過濾。
好比,我想讓一個類模版指定類型如int能編譯過,其餘編譯不過,代碼實現以下:


template <typename T>
class A;

template<>
class A<int>
{

};

int main()
{
    A<int> a;
    A<double> b; //error
    return 0;
}


以上代碼,通用的模版沒有實現,只實現了int的特化模版,這樣class A就只接受int類型的模版形參了。 ios

同理,咱們也能實現讓指定類型如int不能編譯過,其餘都能編譯過,代碼以下: 程序員


template <typename T>
class A
{};

template<>
class A<int>;

int main()
{
    A<int> a; //error
    A<double> b;
    return 0;
}


函數模版比類模版多了一個參數傳入的過程,因此能夠省略模版參數,由於能夠從傳入的參數推導。好比:


#include<iostream>
using namespace std;

template< typename T>
int func(T a, T b)
{
    cout << a + b << endl;
    return a + b; 
}

int main()
{
    func<int>(3, 4);
    func(3, 4);
    return 0;
}


func<int>(3, 4);和func(3, 4);調用是等價的。 函數

關於函數模版能夠推導,這裏有一個有趣的問題: spa

若是要實現一個類型轉化的模版,以下兩種定義,那種比較好? code

template<typename Dst, typename Src> Dst convert(Src src)

template<typename Src, typename Dst> Dst convert(Src src)



這兩種定義的差異主要在於模版形參,從直覺上看,從src轉化到dst,可能第二種定義更符合咱們的邏輯,可是第一種定義,更能方便函數模版的調用者—— i = Convert<int>(7.04); ,不須要像這樣寫完整的模版形參—— i = Convert<int, double>(7.04); ,儘管他們是等價的。 開發

這個例子告訴我,對待別人要寬——讓用戶更方便的使用。 io

寫到這裏,又想起一個例子,跟C++模版不要緊: 編譯

咱們做爲開發,在一個類中實現"<"的重載時,也要實現">"和「==」的重載,由於調用者會以爲,既然有了"<"操做,那麼「==」和「>」天然也有。 class

然而,咱們做爲一個類的使用者時,儘量少使用重載方法,採用一個"<"就能知足比較操做。這樣,即便程序員沒有實現全部比較符號的重載,個人代碼也能正常運行。 stream

這又是一個對本身要嚴格,對別人要寬泛的例子。

相關文章
相關標籤/搜索