2017-03-26 10 views
1

저는 the following question and its associated accepted answer을 읽고 있었는데 키워드가없는 struct C의 두 번째 템플릿 매개 변수의 의미가 궁금합니다.템플릿 이름없이 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)...); 
    } 
}; 

내가 코드가 무엇을하고 있는지 알고 있지만 나는 typename 키워드없이 template<typename T, T> struct C; 선언과 그 의미의 두 번째 T의 목적을 파악하지 : 여기

는 코드입니다.

누군가 그 의미를 말해 줄 수 있습니까? 귀하의 답변에 감사드립니다.

+1

그리고 C++ 17은'template 구조체 C;'와'template struct C {/*...*/};'전문화. – Jarod42

답변

2

그것은 템플릿 값 매개 변수입니다.

template<typename T, T> struct C; 

유형 T를 정의한 다음 유형 T 값도 템플릿에 전달한다는 것을 의미합니다. SO 질문의 예에서 유형은 함수 포인터 유형이었고 두 번째 T 값은 일치하는 유형의 함수에 대한 실제 포인터였습니다.

0

T가 이미 그래서 두 번째 T에 class하거나 다시 typename T를 추가하는 경우, 첫 번째 typename T

을 정의, 당신은 얻을 것이다 :

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

예, 그렇지만 동일한 유형의 두 개의 템플릿 매개 변수를 선언해야하는 이유는 무엇입니까? – Papipone

+0

나는 당신의 질문을 놓쳤다. 그러나 나는 당신이 이미'Jason Lang'을 대신해서 대답했다고 생각한다. – HDJEMAI