2017-03-26 7 views
1

私はthe following question and its associated accepted answerのSOを読んでいたので、struct Ctypenameキーワードのないもの)の2番目のテンプレートパラメータの意味は何ですか?ここでテンプレート名の型名なし

コードです:

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)...); 
    } 
}; 

私はコードが何をしているか知っているが、私はtypenameキーワードなしtemplate<typename T, T> struct C;宣言とその意味の第二Tの目的を考え出していません。

誰かが私にその意味を教えてもらえますか?あなたの答えをありがとう。

+1

そして、C++ 17は 'テンプレート構造体C;'と 'テンプレート<型名T、型名R、型名...を許容するでしょう...> Args、R(T :: * F)(Args ...)> struct C {/*...*/}; '特殊化。 – Jarod42

答えて

2

これは、テンプレート値パラメータです。

template<typename T, T> struct C; 

タイプTを定義し、次にタイプTの値をテンプレートに渡すことを意味します。 SO質問の例では、型が関数ポインタ型であった場合、2番目のTの値は、一致する型の関数への実際のポインタでした。

0

Tがすでにですから、第2のTにclassまたは再typename Tを追加する場合、最初のtypename T

を定義している、あなたが取得します:

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

はい、なぜ同じタイプの2つのテンプレートパラメータを宣言する必要がありますか? – Papipone

+0

私はあなたの質問を逃しましたが、私はあなたがすでに 'ジェイソンLang'のために答えを持っていると思います – HDJEMAI

関連する問題