2017-03-26 49 views
1

我正在閱讀SO上的the following question and its associated accepted answer,我想知道struct C(沒有typename關鍵字的那個)的第二個模板參數是什麼意思。沒有typename的模板參數

下面是代碼:

template<typename T, T> struct C; // Here. 

template<typename T, typename R, typename ...Args, R (T::*F)(Args...)> 
struct C<R (T::*)(Args...), F> 
{ 
    R operator()(T &obj, Args&&... args) 
    { 
     return (obj.*F)(std::forward<Args>(args)...); 
    } 
}; 

我知道代碼是做什麼,但我沒有想出template<typename T, T> struct C;聲明及其含義的第二T的目的,而不typename關鍵字。

有人能告訴我它的含義嗎?感謝您的回答。

+1

和C++ 17將允許'template struct C;'和'template struct C {/*...*/};'專業化。 – Jarod42

回答

2

它的模板值參數。

template<typename T, T> struct C; 

表示您定義類型T,然後還將類型T的值傳遞給模板。在SO問題的例子中,類型是一個函數指針類型,然後第二個T的值是一個指向匹配類型函數的實際指針。

0

T在第一typename T已經定義,

所以,如果你在第二個T加class或再次typename T,您將獲得:

error C2991: redefinition of template parameter 'T' 
+0

是的,但爲什麼我們必須聲明兩個相同類型的模板參數? – Papipone

+0

我錯過了你的問題,但我認爲你已經有了代表'Jason Lang'的答案 – HDJEMAI

相關問題