【Swift 3 && C++11】<第一部分> 概覽(8): Swift 泛型 與 C++ 泛型

編程范式

|Swift|C++
:-:|:-:|:-:
有用的關(guān)鍵字和符號|<>, where|template,<>

先來介紹 Swift 的泛型.

Swift 中在尖括號里寫一個名字來創(chuàng)建一個泛型函數(shù)或者類型:

func makeArray<Item>(repeating item: Item, numberOfTimes: Int) -> [Item] {
    var result = [Item]()
    for _ in 0..<numberOfTimes {
         result.append(item)
    }
    return result
}
makeArray(repeating: "knock", numberOfTimes:4)

你可以創(chuàng)建泛型函數(shù), 方法, 類, 枚舉和結(jié)構(gòu)體:

enum OptionalValue<Wrapped> {
    case none
    case some(Wrapped)
}
var possibleInteger: OptionalValue<Int> = .none
possibleInteger = .some(100)

在類型名后面使用where來指定對類型的特殊需求, 比如, 限定類型實現(xiàn)某一個協(xié)議, 限定兩個類型是相同的,或者限定某個類必須有一個特定的父類:

func anyCommonElements<T: Sequence, U: Sequence>(_ lhs: T, _ rhs: U) -> Bool
    where T.Iterator.Element: Equatable, T.Iterator.Element == U.Iterator.Element {
    for lhsItem in lhs {
        for rhsItem in rhs {
            if lhsItem == rhsItem {
                return true
            }
        }
    }
   return false
}
anyCommonElements([1, 2, 3], [3])

練習: 修改anyCommonElements(_:_:) 函數(shù)來創(chuàng)建一個函數(shù),返回一個數(shù)組,內(nèi)容是兩個序列的共有元素。

注意, <T: Equatable><T where T: Equatable>是等價的.

** C++中**的泛型分為泛型函數(shù)和泛型類. 通過創(chuàng)建相應(yīng)的模板實現(xiàn): 函數(shù)模板和類模板.

類模板, 以 template開頭, 尖括號中寫類型參數(shù)名列表, 類型參數(shù)名以 classtypename開頭, 再后面寫類的定義:

#include <iostream>
using namespace std;

template <typename T>
class Class1 {
public:
    T doSomething(const T);
    T t;
};

int main() {

    Class1<int> class1;
    Class1<double> class2;

    return 0;
}

函數(shù)模板,和類模板類似:

#include <iostream>
using namespace std;

template <typename T>
void doSomething(T t) {
    cout << t+1 << endl;
}

int main() {

    doSomething(5);
    
    return 0;
}

注意到, 在使用函數(shù)模板的時候, 和使用一般函數(shù)一樣doSomething(5);, 而使用類模板時候需要顯式指定類型實參Class<int> class1;.

這是因為當我們使用函數(shù)模板來調(diào)用某一個具體的函數(shù)時, 編譯器將為我們自動推斷出模板參數(shù),比如doSomething(5); 編譯器將推斷出類型參數(shù)Tint.

而使用類模板的時候, 就沒有這樣方便了, 我們必須在使用類模板的時候需要顯式的指定模板實參.

另外在定義模板(不管是函數(shù)模板還是類模板)時, 尖括號中的模板參數(shù)列表,并非必須是需要classtypename開頭標示的某一類型, 它們也可以是確定的類型,比如template<int N> ...:

#include <iostream>
using namespace std;

template <int T>
void doSomething() {
    cout << T << endl;
}

template <const char ch>
class Class {
    
public:
    void doSomething() {
        cout << ch << endl;
    }
};

int main() {


    doSomething<5>();
    
    Class<'k'> class1;
    class1.doSomething();
    
    return 0;
}

不過, 此時在使用模板的時候,尖括號的內(nèi)容必須用常量表達式來提供給模板.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本章將會介紹 泛型所解決的問題泛型函數(shù)類型參數(shù)命名類型參數(shù)泛型類型擴展一個泛型類型類型約束關(guān)聯(lián)類型泛型 Where...
    寒橋閱讀 713評論 0 2
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,679評論 1 51
  • 136.泛型 泛型代碼讓你可以寫出靈活,可重用的函數(shù)和類型,它們可以使用任何類型,受你定義的需求的約束。你可以寫出...
    無灃閱讀 1,658評論 0 4
  • 泛型的概念 泛型代碼可根據(jù)自定義需求,寫出適用于任何類型、靈活且可重用的函數(shù)和類型,避免重復(fù)的代碼,用一種清晰和抽...
    伯wen閱讀 462評論 0 2
  • 很多個日子以前,聽了一場講座分享,一個女孩子,有著小麥般健康的膚色,曼妙的身材,及腰的長發(fā),說話的時候不急不緩,眼...
    旅行祈禱與愛閱讀 795評論 0 3

友情鏈接更多精彩內(nèi)容