★07.關(guān)于類模板

簡述

  • 類模板:是類類型的模板,如:vector。
  • 模板類:類模板的實例化,如:vector<int>。
  • 類模板的模板參數(shù)無法通過模板參數(shù)自動推斷來確定,必須顯式指定。

定義

類模板的定義和聲明必須放在頭文件中

template<typename T>
class A {
public:
    A();
    void fun1();
    void fun2() {}   // 定義在模板內(nèi)部
};

template<typename T>
A<T>::A() {
}

template<typename T>
void A<T>::fun1() {
}

特化

代碼

template <typename T>
class A {
public:
    A() { std::cout << "A<T>" << std::endl; }
};

template <>
class A<double> {
public:
    A() { std::cout << "A<double>" << std::endl; }
};

int main() {
    A<int> a1;
    A<double> a2;
    return system("pause");
}

輸出結(jié)果

A<T>
A<double>

特化成員函數(shù)

template <typename T>
class A {
public:
    void fun() {
        std::cout << "A<T>::fun()" << std::endl;
    }
};

// 只特化類模板的部分成員
template <>
void A<int>::fun() {
    std::cout << "A<int>::fun()" << std::endl;
}

前置聲明與友元聲明

// 前置聲明不需要給出模板參數(shù)
template <typename> class A1;
template <typename> class A2;


template <typename T>
class B {
public:
    friend class A1<T>;                      // 一對一友元關(guān)系
    friend class A2<int>;                    // 多對某一友元關(guān)系
    template <typename> friend class A3;     // 多對多友元關(guān)系,也有前置聲明的作用
};

// 類模板的特化
template <>
class B<int> {
public:
    friend class A2<int>;                    // 某一對某一友元關(guān)系
    template <typename> friend class A3;     // 某一對多友元關(guān)系,也有前置聲明的作用
};

可以省略模板實參的情況

template <typename T>
class A {
public:
    // 類模板作用域內(nèi)可以直接使用類模板名字而不必提供模板參數(shù)
    // 即模板作用域內(nèi)直接使用類模板名A時,編譯期會解讀為A<T>
    A fun1(A a) {
        A b;
        return b;
    }

    A fun2(A a);
};

// 類模板作用域外不可以直接使用類模板名A取代A<T>
template <typename T>
A<T> A<T>::fun2(A a) {
    // 類模板成員函數(shù)的形參列表及其函數(shù)體屬于類模板作用域內(nèi)
    A b;
    return b;
}

模板類型別名

template <typename T> using name1 = pair<T, T>;
template <typename T> using name2 = pair<T, char>;

int main() {
    name1<int> t1;          // t1是一個pair<int, int>
    name2<int> t2;          // t2是一個pair<int, char>
    return system("pause");
}

使用模板參數(shù)的類型成員

class A {
public:
    typedef int value_type;
};

template <typename T>
class B {
public:
    typedef typename T::value_type type;

    typename T::value_type fun() {
        return typename T::value_type();
    }
};

默認模板實參

template <typename T = int, typename F = double>
class A {
};

int main() {
    A<> a1;                 // A<int, double>
    A<double> a2;           // A<double, double>
    A<string, string> a3;   // A<string, string>
    return system("pause");
}

顯式實例化

顯式實例化類模板時會顯式實例化其所有成員。

// 顯式實例化的作用是避免編譯器多次重復(fù)實例化啊,可以達到加快編譯速度的效果
// 下述代碼不能同時出現(xiàn)在一個文件中
template class A<int>;                // 定義,代表在此處將類模板A實例化為A<int>
extern template class A<int>;         // 聲明,代表承諾在別的文件中有個A<int>實例化
最后編輯于
?著作權(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)容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,676評論 1 51
  • C++ 模板簡介 一、模板 使用模板的目的就是能夠讓程序員編寫與類型無關(guān)的代碼。 模板是一種對類型進行參數(shù)化的工具...
    MinoyJet閱讀 2,527評論 0 12
  • 前言 人生苦多,快來 Kotlin ,快速學(xué)習(xí)Kotlin! 什么是Kotlin? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,699評論 9 118
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,706評論 18 399
  • 馬上快考六級了,聽力不好,作文不會,翻譯翻不出來,各種煩。而我恰巧不是那種跌倒了能馬上站起來的人,跌倒了我會煩,我...
    就像冬日的暖陽閱讀 392評論 0 0

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