2011-09-23 62 views
6

在Bjarne Stroustrup C++ Book(第13章,第331頁)中,它表示「模板參數可用於後續模板參數的定義」。它給出了以下代碼:必須將模板參數設置爲類型嗎?

template<class T, T def_val> class Cont{ /* ... */ } 

任何人都可以提供如何使用此模板的示例。例如,如何初始化Cont的一個對象?它在我看來「def_val」不是一個類型參數,不應該放在<>中。我錯了嗎?

非常感謝

+3

你應該知道,這是有效的,只有當T是一個整數類型 – Riga

回答

7

你可以做這樣的事情:爲類型

Cont<int, 6> cnt; 
//  ^as long as this is of type T (in this case int) 
// def_val will be of type int and have a value of 6 

模板參數不是必需的。

這隻能當T爲整型(intunsignedlongchar等,但不floatstd::stringconst char*等),如@Riga在他/她的評論中提及。

6

def_val是一個值參數。一個實例可以是這樣的:

Cont<int, 1> foo; 

一個有趣的情況下,這是非常有用的,當你想有一個指針指向一個類成員爲模板paremeter:

template<class C, int C::*P> 
void foo(C * instance); 

這使得foo是使用指向任何類的int類型成員的指針實例化。

+2

雖然我認爲正確的術語是「非類型模板參數」。 – pmr

3

下面是如何實例上面的例子:

template<class T, T def_val> class Cont{ /* ... */ }; 

int main() 
{ 
    Cont<int,42> c; 
} 
2

T def_valT類型(這是以前通過)的一個對象。例如,它可以用於初始化容器中的項目。使用時,它看起來是這樣的:

Object init(0); 
Cont<Object, init> cont; 

(僞代碼; Object顯然必須是一個類型是合法的,以這種方式使用)

那然後使用第二個模板參數。它包含在模板中,因爲它具有模板類型; def_val必須是T類型,並且必須在創建對象時傳遞。

+0

我不知道這是否有效。也許如果Object的構造函數是constexpr? –

+0

增加了一點免責聲明。 – ssube

相關問題