中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++類模板與函數模板實例分析

發布時間:2022-08-09 17:23:23 來源:億速云 閱讀:145 作者:iii 欄目:開發技術

這篇文章主要講解了“C++類模板與函數模板實例分析”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C++類模板與函數模板實例分析”吧!

函數模板

當我們想要定義一個可以支持泛型的函數時,就要采用函數模板的方式了。所謂泛型就是可以支持多種類型的操作,比如我們定義一個compare操作,他可以根據傳遞給他的參數類型動態調用對應的函數版本,實現多種類型的比較。

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

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

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

 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類型的參數作為compare比較的參數。模板函數也支持多個類型,我們可以再定義一個支持多個參數類型的模板函數

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

調用規則和上邊類似,傳遞兩個不同類型即可

 printData(3.4, "hello world");

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

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

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

調用的時候N和M會自動根據實參獲取值

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

M和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;
    //構造函數
    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 中元素數目
    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;
    //校驗數據是否有效
    void check(size_type i, const std::string &msg) const;
};

我們在類外實現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];
}

每一個類的成員函數在類外實現時都要聲明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;
}

感謝各位的閱讀,以上就是“C++類模板與函數模板實例分析”的內容了,經過本文的學習后,相信大家對C++類模板與函數模板實例分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

项城市| 安乡县| 紫云| 扎兰屯市| 邯郸市| 夏河县| 祥云县| 思南县| 葫芦岛市| 海晏县| 湘潭县| 锡林浩特市| 灵武市| 鲁山县| 澄迈县| 林甸县| 普安县| 岳池县| 宜川县| 宁南县| 宜宾县| 石首市| 永兴县| 南汇区| 达拉特旗| 贺兰县| 子洲县| 乌鲁木齐市| 略阳县| 靖安县| 凉城县| 观塘区| 项城市| 芷江| 鹰潭市| 花莲县| 龙南县| 玛多县| 望江县| 廉江市| 迁西县|