2014-04-23 4 views

답변

2

는 이미 사용할 수 있습니다 (C++ 11) <type_traits>에서 std::remove_pointer<T>::type있다.

+0

도움이되지 않습니다 그 참조 이 경우에는 - 형식이 아닌 포인터를 템플릿 매개 변수로 전달하려고합니다. – Kietz

+0

대신'decltype (& three)'를 사용하십시오 :'remove_pointer :: type' – zneak

1

예, 다음과 같은이 달성하기 위해 부분 특수화를 사용합니다 :

template<typename T, T* p> 
struct foo { }; 

extern int three = 3; 
foo<decltype(three), &three> bar; 
:

template<typename T> 
struct examine { 
    typedef T pointed_type; 
}; 

template<typename T> 
struct examine<T*> { 
    typedef T pointed_type; 
}; 

비 형 템플릿 매개 변수의 사용에 대한 의견을 참조하기를, 다음 사항을 고려

foo&x의 템플릿 매개 변수를 실제로 사용할 수 있지만 먼저 매개 변수를 type으로 지정해야합니다 (또는 int*으로 제한하십시오. 엘). 이 작업을 수행하지 않으면 템플릿 매개 변수 p이 정의되어있는 경우 T이라는 이름이 어떤 유형도 아닙니다.

T의 자동 공제를 수행하는 방법은 없습니다. 템플릿 인수가 다른 순서로 정의되어야하기 때문입니다.

당신이 decltype를 사용하지 않고 얻을 수있는 가장 가까운 다시 그렇게

template<typename T> 
void deduce_argument_type(T const&) 
{ 
    // here, the type T is (close to) that of your argument 
} 
deduce_argument_type(&three); // uses deduce_argument_type<int*> 

같은 추론 할 템플릿 형식 매개 변수의 원인이됩니다 비 템플릿 인수를 얻는 함수 템플릿을 정의하여, 당신은이를 사용할 수 없습니다 &three을 전달하기 전에 T을 정의하는 제한을 없애기 위해 템플릿 매개 변수 공제는 전달한 템플릿 매개 변수의 오른쪽에만 유형을 추론하기 때문에

+0

이렇게하면 '템플릿 struct examine'에 대한 템플릿 매개 변수 목록에서 인수 1의 유형/값이 일치하지 않습니다. . – Kietz

+1

값을 유형으로 사용할 수 없습니다. 따라서'& three'를 괄호 안에 넣는 것은 어쨌든 잘못된 것이다. 원하는 경우 C++ 11'decltype'을 사용하거나 함수 템플리트를 사용하고'& three'를 전달하여 인수 유형을'int * '로 추론합니다. –

+0

C++은 [형식이 아닌 템플릿 매개 변수를 허용합니다.] (http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fnon -type_template_parameters.htm) – Kietz