C++11 模板元編程 - 模板的類型參數(shù)


下面是我們熟悉的類模板的例子:一個(gè)簡(jiǎn)單的容器棧,它可以支持不同的類型做元素。

#include <vector>
#include <stdexcept>

template<typename T>
struct Stack
{
    void push(const T& elem)
    {
        elems.push_back(elem);
    }

    T pop()
    {
        if(empty()) throw std::out_of_range("Stack<>::pop: empty!");

        auto elem = elems.back();
        elems.pop_back();
        return elem;
    }

    bool empty() const
    {
        return elems.empty();
    }

private:
    std::vector<T> elems;
};

它的用法如下:

Stack<int> intStack;
intStack.push(-1);
intStack.push(2);
intStack.push(-3);
std::cout << intStack.pop() << std::endl;

Stack<char> charStack;
charStack.push('A');
charStack.push('B');
std::cout << charStack.pop() << std::endl;

對(duì)于模板元編程,我們可以將類模板想象成一個(gè)編譯期的函數(shù),不同的是它的參數(shù)列表放在一對(duì)尖括號(hào)中。通過(guò)template<typename T> struct Stack我們聲明了一個(gè)編譯期的函數(shù),它的名字叫做Stack,它有一個(gè)類型形參T。

標(biāo)準(zhǔn)規(guī)定可以用typename或者class關(guān)鍵字指示模板形參是一個(gè)類型,不能使用struct。由于模板的類型形參不僅可以被替換為用戶自定義類型,也可以被替換為內(nèi)置類型(int, char, double...),所以使用typename語(yǔ)義上比class更清晰一些。本文統(tǒng)一使用typename。

如同把具體的實(shí)參傳遞給一個(gè)函數(shù),函數(shù)就會(huì)計(jì)算求值一樣,當(dāng)我們把具體的類型當(dāng)做實(shí)參傳遞給類模板時(shí),類模板會(huì)在編譯期進(jìn)行計(jì)算,返回一個(gè)具體的類型。類模板的傳參和函數(shù)類似,只不過(guò)語(yǔ)法上使用尖括號(hào)。

上例中我們分別將int和char當(dāng)做實(shí)參,傳遞給類模板Stack。Stack得到實(shí)參后變成具體的類型Stack<int>Stack<char>。根據(jù)運(yùn)行期C++的要求,只有具體類型才能產(chǎn)生對(duì)象,所以我們分別用Stack<int>Stack<char>生成了兩個(gè)對(duì)象intStackcharStack。

類模板的實(shí)現(xiàn)中可以繼續(xù)使用類模板。上例中Stack的實(shí)現(xiàn)中使用了標(biāo)準(zhǔn)庫(kù)中的類模板std::vector。一旦我們?cè)赟tack中用具體類型替換形參T,std::vector<T>也會(huì)被傳遞參數(shù)從而變成一個(gè)具體類型,使得可以產(chǎn)生elems對(duì)象。

上面雖然我們用編譯期函數(shù)來(lái)類比類模板,但是這時(shí)的類模板還遠(yuǎn)未達(dá)到模板元編程的要求,我們繼續(xù)!


模板的默認(rèn)參數(shù)

返回 C++11模板元編程 - 目錄

最后編輯于
?著作權(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)容

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