亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

黎城县| 林周县| 南昌市| 汕尾市| 韩城市| 江油市| 山东省| 黄浦区| 施秉县| 永修县| 墨玉县| 沅陵县| 集贤县| 云梦县| 伊宁市| 弋阳县| 铜川市| 宁夏| 沅陵县| 那曲县| 密云县| 亳州市| 定日县| 桐梓县| 连州市| 夏河县| 开阳县| 陆川县| 宜阳县| 张北县| 台北县| 兴宁市| 唐海县| 府谷县| 应城市| 淮南市| 宣威市| 滦平县| 增城市| 灵武市| 白山市|