二、泛型的個(gè)人理解

泛型是 C++ 模板的一個(gè)主要用途,另一個(gè)應(yīng)該是元編程了。
我個(gè)人理解,泛型的用途有兩個(gè),一為去類(lèi)型封裝,二為建立鴨子方法。

  1. 去類(lèi)型封裝

以 類(lèi) C 方式封裝一個(gè) int[] 數(shù)組

const int len = 10;

class ArrayInt {
private:
    int datas[len];
public:
    ArrayInt();
    int & operator[] (int pos);
};

上述類(lèi)型只能使用 int 類(lèi)型,若使用 double 等其他類(lèi)型,或者不同長(zhǎng)度,就要手動(dòng)重復(fù)定義。于是出現(xiàn)模板實(shí)現(xiàn)。

template <typename T, int N>
class Array {
private:
    T datas[N];
public:
    Array();
    T & operator[] (int pos);
};

但這種形式,會(huì)存在模板的一個(gè)問(wèn)題 —— 若其方法行數(shù)很多,不能內(nèi)聯(lián)時(shí),不同類(lèi)型就會(huì)產(chǎn)生不同的方法,最終導(dǎo)致編譯后的文件特別大。

這時(shí)可利用,C 常用去類(lèi)型的方法。

class Array_impl {
private:
    void *datas;
public:
    Array_impl(void *p) : datas(p) {}
    void *get(int pos, size_t size);
};

template <typename T, int N>
class Array : protected Array_impl {
public:
    Array() : Array_impl(new T[N]) {}
    T & operator[] (int pos) {
        assert(pos < N); 
        return static_case<T &>(*(Array_impl::get(pos, sizeof(T))));
    }
};
  1. 鴨子類(lèi)型

當(dāng)你看到一只鳥(niǎo)走起來(lái)像鴨子,游泳起來(lái)鴨子,叫起來(lái)也像鴨子,那么這只鳥(niǎo)就被稱(chēng)為鴨子類(lèi)型

T sum(T a, T b) {
  return a + b;
}

上面的例子,只要類(lèi)型 T 存在方法 operator+(T, T) -> T,那就能通過(guò) sum() 方法了。不管他是什么類(lèi)型,還是說(shuō),他的加法本質(zhì)實(shí)現(xiàn)的是除法,只要存在這個(gè)接口,就是好類(lèi)型。

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

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

  • 簡(jiǎn)介 泛型的意思就是參數(shù)化類(lèi)型,通過(guò)使用參數(shù)化類(lèi)型創(chuàng)建的接口、類(lèi)、方法,可以指定所操作的數(shù)據(jù)類(lèi)型。比如:可以使用參...
    零度沸騰_yjz閱讀 3,409評(píng)論 1 15
  • 回首望來(lái)做了程序員也有些年頭了,一直渾渾噩噩,從事Android也有三年多了,最近回頭一看自己還是什么都不會(huì)...
    暴躁的心閱讀 519評(píng)論 1 2
  • @[toc] 1.泛型概述 在Thinking in java 第五版的第二十章中,開(kāi)篇說(shuō)到,在普通的類(lèi)和方法中只...
    冬天里的懶喵閱讀 1,193評(píng)論 0 0
  • 泛型之前[https://www.bilibili.com/video/BV1Jt4y1r782?spm_id_f...
    笨笨11閱讀 303評(píng)論 0 0
  • 1. 泛型的一些概念 Java從1.5開(kāi)始加入了泛型,主要是解決類(lèi)型安全及擴(kuò)展問(wèn)題,它的本質(zhì)是參數(shù)化類(lèi)型的應(yīng)用,也...
    MadnessXiong閱讀 387評(píng)論 0 0

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