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

一、非類型模板參數(shù)

簡(jiǎn)單點(diǎn)說(shuō)就是在定義模板時(shí)脖祈,模板的類型參數(shù)不是一個(gè)泛型的 T,而是一個(gè)具體的類型刷晋。這種比較多的是在比如定就義容器類模板時(shí)盖高,指定容器的容量大小。如下 SStack 的定義眼虱。

template<typename T, std::size_t MaxSize>
class SStack{
private:
    std::array<T, MaxSize> elems;
    std::size_t numElems;
public:
    SStack();
    void push(const T& t);
    void pop();
    const T& top() const;
    bool empty() const {
        return numElems == 0;
    }
    std::size_t size() const {
        return numElems;
    }
};

template<typename T, std::size_t MaxSize>
SStack<T, MaxSize>::SStack() {}

template<typename T, std::size_t MaxSize>
void SStack<T, MaxSize>::push(const T &t) {
    assert(numElems < MaxSize);
    elems[numElems] = t;
    ++numElems;
}

template<typename T, std::size_t MaxSize>
void SStack<T, MaxSize>::pop() {
    assert(!elems.empty());
    --numElems;
}

template<typename T, std::size_t MaxSize>
const T& SStack<T, MaxSize>::top() const{
    assert(!elems.empty());
    return elems[numElems-1];
}

下面是使用代碼

SStack<float, 30> sStack30;
SStack<float, 50> sStack50;

看起來(lái)還是很簡(jiǎn)單的喻奥,誰(shuí)說(shuō)不是呢?

二捏悬、非類型模板參數(shù)的限制

非類型模板參數(shù)并不是所有類型都可以的撞蚕,是有一定限制的:

  1. 只能是整型常量包括枚舉,比如过牙,如果是個(gè) std::string 則會(huì)報(bào)以下錯(cuò)誤信息甥厦。


    image.png
  2. 指向 objects/function/members 的指針或者引用。但注意抒和,指針?biāo)赶虻膶?duì)象不能是字符串常量矫渔、局部變量或者數(shù)據(jù)成員及其子類對(duì)象彤蔽。而且摧莽,這里還有版本的差異。在 C++11 中顿痪,要求指針?biāo)傅膶?duì)象必須是 extern 的镊辕,而在 C++ 14 則要求必須 extern 或者文件內(nèi)的全局變量,而在 C++ 17 后蚁袭,這些限制都放寬了征懈。

  3. objects/function 的左值引用,或者 nullptr揩悄。

三卖哎、使用 auto 關(guān)鍵字使非類型模板參數(shù)的類型更加泛化

使用 auto 關(guān)鍵字作為非類型模板參數(shù)時(shí)的定義

template<typename T, auto MaxSize>
class AutoStack{
private:
    std::array<T, MaxSize> elems;
    using size_type = decltype(MaxSize);
    size_type numElems;
public:
    AutoStack();
    void push(const T& t);
    void pop();
    const T& top() const;
    bool empty() const {
        return numElems == 0;
    }
    auto size() const {
        return numElems;
    }
};

template<typename T, auto MaxSize>
AutoStack<T, MaxSize>::AutoStack() {}

template<typename T, auto MaxSize>
void AutoStack<T, MaxSize>::push(const T &t) {
    assert(numElems < MaxSize);
    elems[numElems] = t;
    ++numElems;
}

template<typename T, auto MaxSize>
void AutoStack<T, MaxSize>::pop() {
    assert(!elems.empty());
    --numElems;
}

template<typename T, auto MaxSize>
const T& AutoStack<T, MaxSize>::top() const{
    assert(!elems.empty());
    return elems[numElems-1];
}

上面有兩個(gè)比較有意思的地方,一個(gè)是可以通過(guò) decltype 返回 auto 的實(shí)際類型從而來(lái)定義 numElems 屬性。另一個(gè)是 size() 方法的返回屬性可以用 auto 關(guān)鍵字來(lái)讓編譯器自動(dòng)推導(dǎo)亏娜。真的是妙啊焕窝。

四肴掷、總結(jié)

  1. 通過(guò)非類型模板參數(shù)伴郁,我們可以知道模板的參數(shù)類型不一定非得是類型,也可以是數(shù)值帆啃。只不過(guò)這個(gè)數(shù)值是有一定限制的溯泣,具體限制看第 2 點(diǎn)虐秋。
  2. 不可以將浮點(diǎn)型或者 class 類型的對(duì)象用于非類型模板參數(shù)。使用指向字符串常量垃沦,臨時(shí)變量和子對(duì)象的指針或者引用也有一些限制客给。
  3. 使用 auto 關(guān)鍵字,可以使非類型模板參數(shù)的類型更加泛化肢簿。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末起愈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子译仗,更是在濱河造成了極大的恐慌抬虽,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纵菌,死亡現(xiàn)場(chǎng)離奇詭異阐污,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)咱圆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門笛辟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人序苏,你說(shuō)我怎么就攤上這事手幢。” “怎么了忱详?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵围来,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我匈睁,道長(zhǎng)监透,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任航唆,我火速辦了婚禮胀蛮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘糯钙。我一直安慰自己粪狼,他們只是感情好退腥,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著再榄,像睡著了一般阅虫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上不跟,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天颓帝,我揣著相機(jī)與錄音,去河邊找鬼窝革。 笑死购城,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的虐译。 我是一名探鬼主播瘪板,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼漆诽!你這毒婦竟也來(lái)了侮攀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤厢拭,失蹤者是張志新(化名)和其女友劉穎兰英,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體供鸠,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡畦贸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了楞捂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片薄坏。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖寨闹,靈堂內(nèi)的尸體忽然破棺而出胶坠,到底是詐尸還是另有隱情,我是刑警寧澤繁堡,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布沈善,位于F島的核電站,受9級(jí)特大地震影響帖蔓,放射性物質(zhì)發(fā)生泄漏矮瘟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一塑娇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧劫侧,春花似錦埋酬、人聲如沸哨啃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拳球。三九已至,卻和暖如春珍特,著一層夾襖步出監(jiān)牢的瞬間祝峻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工扎筒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留莱找,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓嗜桌,卻偏偏與公主長(zhǎng)得像奥溺,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子骨宠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 非類型的類模板參數(shù) 使用該模板需要同時(shí)指定類型和個(gè)數(shù) 非類型模板參數(shù)也可以指定默認(rèn)值 非類型的函數(shù)模板參數(shù) 這類模...
    奇點(diǎn)創(chuàng)客閱讀 173評(píng)論 2 2
  • 前面的例子中浮定,我們分別使用了類型和模板作為類模板的參數(shù)。除此之外层亿,模板還支持非類型模板參數(shù)桦卒。 如下用數(shù)組實(shí)現(xiàn)Sta...
    MagicBowen閱讀 4,950評(píng)論 2 0
  • 非類型模板參看,顧名思義匿又,模板參數(shù)不限定于類型闸盔,普通值也可作為模板參數(shù)。在基于類型的模板中琳省,模板實(shí)例化時(shí)所依賴的是...
    cp3_1dbc閱讀 1,331評(píng)論 0 0
  • 非類型參數(shù): non-type template argument, 支持的類型定義an integral typ...
    極光火狐貍CPP閱讀 235評(píng)論 0 0
  • 1. 類型別名作為成員(P243 除了定義數(shù)據(jù)和函數(shù)成員之外迎吵,類還可以自定義某種類型在類中的別名。由類定義的類型名...
    何幻閱讀 2,005評(píng)論 0 1