在Bjarne Stroustrup C++ Book(第13章,第331頁)中,它表示「模板參數可用於後續模板參數的定義」。它給出了以下代碼:必須將模板參數設置爲類型嗎?
template<class T, T def_val> class Cont{ /* ... */ }
任何人都可以提供如何使用此模板的示例。例如,如何初始化Cont的一個對象?它在我看來「def_val」不是一個類型參數,不應該放在<>中。我錯了嗎?
非常感謝
在Bjarne Stroustrup C++ Book(第13章,第331頁)中,它表示「模板參數可用於後續模板參數的定義」。它給出了以下代碼:必須將模板參數設置爲類型嗎?
template<class T, T def_val> class Cont{ /* ... */ }
任何人都可以提供如何使用此模板的示例。例如,如何初始化Cont的一個對象?它在我看來「def_val」不是一個類型參數,不應該放在<>中。我錯了嗎?
非常感謝
你可以做這樣的事情:爲類型
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
爲整型(int
,unsigned
,long
,char
等,但不float
,std::string
,const char*
等),如@Riga在他/她的評論中提及。
def_val
是一個值參數。一個實例可以是這樣的:
Cont<int, 1> foo;
一個有趣的情況下,這是非常有用的,當你想有一個指針指向一個類成員爲模板paremeter:
template<class C, int C::*P>
void foo(C * instance);
這使得foo
是使用指向任何類的int
類型成員的指針實例化。
雖然我認爲正確的術語是「非類型模板參數」。 – pmr
下面是如何實例上面的例子:
template<class T, T def_val> class Cont{ /* ... */ };
int main()
{
Cont<int,42> c;
}
T def_val
是T
類型(這是以前通過)的一個對象。例如,它可以用於初始化容器中的項目。使用時,它看起來是這樣的:
Object init(0);
Cont<Object, init> cont;
(僞代碼; Object
顯然必須是一個類型是合法的,以這種方式使用)
那然後使用第二個模板參數。它包含在模板中,因爲它具有模板類型; def_val
必須是T
類型,並且必須在創建對象時傳遞。
我不知道這是否有效。也許如果Object的構造函數是constexpr? –
增加了一點免責聲明。 – ssube
你應該知道,這是有效的,只有當T是一個整數類型 – Riga