最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++類模板與函數(shù)模板基礎(chǔ)詳細(xì)講解

 更新時間:2022年08月09日 15:34:58   作者:戀戀風(fēng)辰  
C++語言的模板技術(shù)包括函數(shù)模板和類模板,模板技術(shù)是一種代碼重用技術(shù),函數(shù)和類是C++語言中兩種主要的重用代碼形式,這篇文章主要介紹了C++函數(shù)模板和類模板,需要的朋友可以參考下

函數(shù)模板

當(dāng)我們想要定義一個可以支持泛型的函數(shù)時,就要采用函數(shù)模板的方式了。所謂泛型就是可以支持多種類型的操作,比如我們定義一個compare操作,他可以根據(jù)傳遞給他的參數(shù)類型動態(tài)調(diào)用對應(yīng)的函數(shù)版本,實現(xiàn)多種類型的比較。

template <typename T>
int compare(const T &v1, const T &v2)
{
    if (v1 < v2)
        return -1;
    if (v2 < v1)
        return 1;
    return 0;
}

比較函數(shù)是一個模板函數(shù),它支持T類型的對象比較,模板函數(shù)定義的規(guī)則是用template 聲明模板的類型為T,然后用T做參數(shù)即可。

調(diào)用的規(guī)則傳遞實參就可以了,前提是實參的類型要支持比較大小,如果是類的類型我們可以重載比較運算符。

 int res = compare(3, 4);
    cout << "compare(3,4) res is " << res << endl;
    vector<int> v1 = {1, 3, 5};
    vector<int> v2 = {2, 4};
    res = compare(v1, v2);
    cout << "compare(v1, v2) res is " << res << endl;

我們分別傳遞了int類型和vector類型的參數(shù)作為compare比較的參數(shù)。模板函數(shù)也支持多個類型,我們可以再定義一個支持多個參數(shù)類型的模板函數(shù)

template <typename T, typename U>
int printData(const T &t, const U &u)
{
    cout << "t is " << t << endl;
    cout << "u is " << u << endl;
}

調(diào)用規(guī)則和上邊類似,傳遞兩個不同類型即可

 printData(3.4, "hello world");

模板函數(shù)也支持非參數(shù)類型,用已知類型定義變量

template <unsigned N, unsigned M>
int compareArray(const char (&p1)[N], const char (&p2)[M])
{
    return strcmp(p1, p2);
}

compareArray的模板里用了已知類型unsigned定義了兩個變量N和M。

調(diào)用的時候N和M會自動根據(jù)實參獲取值

 res = compareArray("hello zack", "nice to meet u");
    cout << "compareArray("
         << "hello zack "
         << ", nice to meet u"
         << ") res is " << res << endl;

M和N就是傳遞的兩個數(shù)組的長度。

類模板

我們實現(xiàn)一個模板類,使其支持類似vector的操作,包括push_back, empty, back, 以及pop_back,取索引[]操作等。

//定義模板類型的blob
template <typename T>
class Blob
{
public:
    typedef T value_type;
    typedef typename std::vector<T>::size_type size_type;
    //構(gòu)造函數(shù)
    Blob()
    {
        data = make_shared<std::vector<T>>();
    }
    Blob(std::initializer_list<T> il)
    {
        data = make_shared<std::vector<T>>(il);
        // for (const T &m : il)
        // {
        //     data->push_back(m);
        // }
    }
    // Blob 中元素數(shù)目
    size_type size() const { return data->size(); }
    bool empty() const { return data->empty(); }
    //添加和刪除元素
    void push_back(const T &t) { data->push_back(t); }
    //移動版本的push_back
    void push_back(const T &&t) { data->push_back(std::move(t)); }
    //刪除元素
    void pop_back();
    //元素訪問
    T &back();
    T &operator[](size_type i);
private:
    std::shared_ptr<std::vector<T>> data;
    //校驗數(shù)據(jù)是否有效
    void check(size_type i, const std::string &msg) const;
};

我們在類外實現(xiàn)check, pop_back, back, 以及[]操作。

template <typename T>
void Blob<T>::check(size_type i, const std::string &msg) const
{
    if (i >= data->size())
        throw std::out_of_range(msg);
}
template <typename T>
void Blob<T>::pop_back()
{
    if (data->empty())
    {
        return;
    }
    data->pop_back();
}
template <typename T>
T &Blob<T>::back()
{
    return data->back();
}
template <typename T>
T &Blob<T>::operator[](size_type i)
{
    check(i, "index out of range");
    return (*data)[i];
}

每一個類的成員函數(shù)在類外實現(xiàn)時都要聲明template。

類模板的使用如下

void use_classtemp()
{
    Blob<int> ia;
    Blob<int> ia2 = {0, 1, 2, 3, 5};
    Blob<string> ia3 = {"hello ", "zack", "nice"};
    for (size_t i = 0; i < ia2.size(); i++)
    {
        ia2[i] = i * i;
    }
    for (size_t i = 0; i < ia2.size(); i++)
    {
        cout << ia2[i] << endl;
    }
    for (size_t i = 0; i < ia3.size(); i++)
    {
        string_upper(ia3[i]);
    }
    for (size_t i = 0; i < ia3.size(); i++)
    {
        cout << ia3[i] << endl;
    }
    const auto &data = ia3.back();
    cout << data << endl;
    ia3.pop_back();
    const auto &data2 = ia3.back();
    cout << data2 << endl;
}

總結(jié)

源碼鏈接

視頻鏈接

到此這篇關(guān)于C++類模板與函數(shù)模板基礎(chǔ)詳細(xì)講解的文章就介紹到這了,更多相關(guān)C++類模板與函數(shù)模板內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言實現(xiàn)自行車存放管理系統(tǒng)

    C語言實現(xiàn)自行車存放管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)自行車存放管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++ cin.getline及getline()用法詳解

    C++ cin.getline及getline()用法詳解

    這篇文章主要介紹了C++ cin.getline用法及C++ getline()的兩種用法,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • C語言 字符串指針詳解及示例代碼

    C語言 字符串指針詳解及示例代碼

    本文主要介紹C語言 字符串指針,這里整理了詳細(xì)資料,并附示例代碼及實現(xiàn)結(jié)果,有興趣的小伙伴可以參考下
    2016-08-08
  • C++基于EasyX庫實現(xiàn)拼圖小游戲

    C++基于EasyX庫實現(xiàn)拼圖小游戲

    這篇文章主要為大家詳細(xì)介紹了C++基于EasyX庫實現(xiàn)拼圖小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 詳解C++編程中的變量相關(guān)知識

    詳解C++編程中的變量相關(guān)知識

    這篇文章主要介紹了詳解C++編程中的變量相關(guān)知識,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • C語言實現(xiàn)井字棋游戲

    C語言實現(xiàn)井字棋游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)井字棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • 利用QT實現(xiàn)圖片瀏覽器的示例詳解

    利用QT實現(xiàn)圖片瀏覽器的示例詳解

    這篇文章主要和大家分享一個小案例:利用QT制作一個小的圖片瀏覽器,要求可以顯示jpg、jpeg、png、bmp,還可以從電腦上拖動圖到窗口并顯示出來,感興趣的可以了解一下
    2023-02-02
  • C++ xxx_cast實現(xiàn)轉(zhuǎn)換代碼實例解析

    C++ xxx_cast實現(xiàn)轉(zhuǎn)換代碼實例解析

    這篇文章主要介紹了C++xxx_cast轉(zhuǎn)換代碼實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • C語言進階練習(xí)二叉樹的遞歸遍歷

    C語言進階練習(xí)二叉樹的遞歸遍歷

    樹是一種重要的非線性數(shù)據(jù)結(jié)構(gòu),直觀地看,它是數(shù)據(jù)元素(在樹中稱為結(jié)點)按分支關(guān)系組織起來的結(jié)構(gòu),很象自然界中的樹那樣。樹結(jié)構(gòu)在客觀世界中廣泛存在,如人類社會的族譜和各種社會組織機構(gòu)都可用樹形象表示,本篇介紹二叉樹的遞歸與非遞歸遍歷的方法
    2022-06-06
  • 一文學(xué)會數(shù)據(jù)結(jié)構(gòu)-堆

    一文學(xué)會數(shù)據(jù)結(jié)構(gòu)-堆

    本文主要介紹了數(shù)據(jù)結(jié)構(gòu)-堆,文中通過圖片和大量的代碼講解的非常詳細(xì),需要學(xué)習(xí)的朋友可以參考下這篇文章,希望可以幫助到你
    2021-08-08

最新評論

凤山市| 深泽县| 汉源县| 浠水县| 朝阳区| 巴彦淖尔市| 寻乌县| 旬邑县| 朔州市| 井冈山市| 兰溪市| 桑植县| 嘉善县| 襄樊市| 徐州市| 巴里| 疏勒县| 石渠县| 吴川市| 仪征市| 深州市| 三原县| 四平市| 广南县| 靖西县| 大厂| 乌拉特中旗| 温宿县| 台前县| 泽州县| 博湖县| 会泽县| 乐山市| 叙永县| 龙海市| 临颍县| 万荣县| 曲水县| 勃利县| 六安市| 聊城市|