偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

理解C++之類模板

開發(fā) 前端
與模板函數(shù)相似,類也可以被一種或多種類型參數(shù)化,標準庫中的容器類就是一個具有這種特性的典型例子。

在前面我們介紹了《C++之函數(shù)模板

今天我們繼續(xù)來介紹模板的另外一種形式:類模板。

與模板函數(shù)相似,類也可以被一種或多種類型參數(shù)化,標準庫中的容器類就是一個具有這種特性的典型例子。

類模板的聲明

我們通過一段例子代碼了解一下類模板的聲明:

// 類模板聲明
template <typename T>
class MyClass{
public:
    T getT();
    void setT(T t);
private:
    T t;
};
// 類成員函數(shù)實現(xiàn)
template<typename T>
T MyClass<T>::getT() {
    return t;
}

template<typename T>
void MyClass<T>::setT(T t) {
    this->t = t;
}

int main(int argc, char* argv[]) {
    // 類模板使用
    MyClass<int> myClass;
    myClass.setT(10);
    std::cout << "myClass:" << myClass.getT() << std::endl;
    return 0;
}

首先也是使用關(guān)鍵字template和關(guān)鍵字typename對類模板進行聲明,當我們將一個類聲明為類模板之后,模板參數(shù)T可以像其他任何類型一樣,用于聲明成員變量和成員函數(shù)。

類模板的成員函數(shù)

通過上面的實例代碼,我們看到在類模板的聲明內(nèi)部函數(shù)時如果用到模板參數(shù)T,則不用再次使用template<typename T>,但是當實現(xiàn)類模板的內(nèi)部函數(shù)時,如果用到了模板參數(shù)T,則還需要在函數(shù)的上方 使用template<typename T>進行標記。

也即是說為了定義類模板的成員函數(shù),你必須指定該成員函數(shù)是一個函數(shù)模板,而且你還需要使用這個類模板的完整類型限定符。

或許你覺得每次定義類模板的內(nèi)部函數(shù)都要使用到模板聲明,當內(nèi)部函數(shù)較多時,則會產(chǎn)生非常多的不必要的聲明,此時我們可以直接在類的內(nèi)部聲明加定義同時實現(xiàn):

// 類模板聲明
template <typename T>
class MyClass{
public:
    // 聲明加定義
    T getT(){
        return t;
    }
    // 聲明加定義
    void setT(T t){
        this->t = t;
    }
private:
    T t;
};

在類模板中只有那些被調(diào)用的成員函數(shù),才會產(chǎn)生這些函數(shù)的實例化代碼。對于類模板,成員函數(shù)只有在被使用的時候才會被實例化。 顯然,這樣可以節(jié)省空間和時間;另一個好處是:對于那些“未能提供所有成員函數(shù)中所有操作的”類型,你也可以使用該類型來實例化類模板, 只要對那些“未能提供某些操作的”成員函數(shù),模板內(nèi)部不使用即可。

類模板的特例化

同模板函數(shù)的特化一樣,你可以用模板實參來特化類模板,和函數(shù)模板的重載類似,通過特化類模板,我們可以優(yōu)化基于某種特定類型的實現(xiàn)。

在類模板的特化過程中有兩個步驟:

  • 在類的起始處聲明一個template<>,接下來聲明用來特化類模板的類型。這個類型被用作模板實參,且必須在類名的后面直接指定。
  • 進行類模板的特化時,每個成員函數(shù)都必須重新定義為普通函數(shù),原來模板函數(shù)中的每個T也相應(yīng)地被進行特化的類型取代。

下面是一個模板類特化的例子:

// 類模板聲明
template <typename T>
class MyClass{
public:
    // 聲明加定義
    T getT(){
        return t;
    }
    // 聲明加定義
    void setT(T t){
        this->t = t;
    }
private:
    T t;
};

// 類模板聲明
template <>
class MyClass<std::string>{
public:
    // 聲明加定義
    std::string getT(){
        return t;
    }
    // 聲明加定義
    void setT(std::string t){
        std::cout << "調(diào)用特化類模板 setT" << std::endl;
        this->t = t;
    }
private:
    std::string t;
};

int main(int argc, char* argv[]) {
    // 類模板使用
    MyClass<std::string> myClass;
    myClass.setT("hello word");
    std::cout << "myClass:" << myClass.getT() << std::endl;
    return 0;
}

模板源碼組織模式

模板源碼的組織模式有好多種,這里只介紹兩種常用的:分別是包含模式和關(guān)鍵字export的分離模式。

包含模式可以說是最常用也是最推薦的一種模式。這種模式就是將模板類的聲明和定義都放在同一個文件中,這個文件一般是擴展名為.hpp的文件。

下面是一個類模板聲明定義和使用分開在不同文件的例子:

MyClass.hpp
#include <iostream>
#include <memory>
// 類模板聲明
template <typename T>
class MyClass{
public:
    // 聲明
    T getT();

    void setT(T t);
private:
    T t;
};

template<typename T>
T MyClass<T>::getT() {
    return t;
}

template<typename T>
void MyClass<T>::setT(T t) {
    this->t = t;
}

在main函數(shù)中使用模板main.cpp:

main.cpp

#include <iostream>
#include <memory>
#include "MyClass.hpp"
int main(int argc, char* argv[]) {
    // 類模板使用
    MyClass<std::string> myClass;
    myClass.setT("hello word");
    std::cout << "myClass:" << myClass.getT() << std::endl;
    return 0;
}

很明顯,包含模式因為包含了類模板的定義實現(xiàn),因而明顯增加了包含頭文件.hpp的開銷,這會導致大大增加了編譯復雜程序所耗費的時間。 然而隨著現(xiàn)代的機器性能提升,這里帶來的編譯開銷基本可以忽略不計,因此這種模式成為了使用最多的模式。

下面我們再來看看關(guān)鍵字export的分離模式。

關(guān)鍵字export的功能使用是非常簡單的:在一個文件里面定義模板,并在模板的定義和(非定義的)聲明的前面加上關(guān)鍵字export。

還是以上面的代碼為例:

(1) MyClass.h

#include <iostream>
#include <memory>
// 類模板聲明
export template <typename T>
class MyClass{
public:
    // 聲明
    T getT();

    void setT(T t);
private:
    T t;
};

(2) MyClass.cpp

#include "MyClass.h"

export template<typename T>
T MyClass<T>::getT() {
    return t;
}

export template<typename T>
void MyClass<T>::setT(T t) {
    this->t = t;
}

以上代碼能否編譯通過取決于你的編譯器,大部分是無法編譯通過的,這代碼和包含模式對比起來是不是有一種脫褲子放屁的感覺?

看起來關(guān)鍵字export的分離模式更加符合C++源碼組織習慣,為什么這種寫法再C++的模板沒有流行起來呢? 這是因為在C++標準推出幾年之后,也就只有極少的公司真正提供了對export關(guān)鍵字的支持。于是,export這個特性未能像其他C++特性那樣廣為流傳, 這就使得程序員在很多編譯器下都不能正常使用export的分離模式。

責任編輯:趙寧寧 來源: 思想覺悟
相關(guān)推薦

2011-07-14 16:56:21

2011-07-14 16:26:01

2010-02-04 14:01:43

C++非類型類模板參數(shù)

2023-12-13 10:51:49

C++函數(shù)模板編程

2023-11-28 11:51:01

C++函數(shù)

2023-12-06 13:48:00

C++代碼

2010-02-03 17:42:33

C++模板參數(shù)

2010-02-06 16:59:19

C++ kmp算法模板

2010-01-26 13:55:07

C++標準模板庫

2010-02-01 10:54:37

C++框架

2022-09-22 10:22:36

C++編程語言代碼

2010-02-02 09:49:02

C++模板

2010-02-04 11:15:28

C++模板限制

2010-02-05 17:58:32

C++鏈棧模板

2023-09-13 11:51:16

位域C++

2024-04-10 12:14:36

C++指針算術(shù)運算

2011-04-11 10:09:20

委托反饋C++

2010-02-04 13:45:36

C++類模板

2010-01-14 10:06:30

C++模板

2011-07-14 23:14:42

C++static
點贊
收藏

51CTO技術(shù)棧公眾號