단일 포인터 매개 변수를 사용하고 가리키는 유형을 추출하는 템플릿을 정의 할 수 있습니까?포인터 템플릿 매개 변수에서 형식을 추출 할 수 있습니까?
extern int three = 3;
typename examine<&three>::pointed_type // int
단일 포인터 매개 변수를 사용하고 가리키는 유형을 추출하는 템플릿을 정의 할 수 있습니까?포인터 템플릿 매개 변수에서 형식을 추출 할 수 있습니까?
extern int three = 3;
typename examine<&three>::pointed_type // int
예, 다음과 같은이 달성하기 위해 부분 특수화를 사용합니다 :
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
을 정의하는 제한을 없애기 위해 템플릿 매개 변수 공제는 전달한 템플릿 매개 변수의 오른쪽에만 유형을 추론하기 때문에
이렇게하면 '템플릿
값을 유형으로 사용할 수 없습니다. 따라서'& three'를 괄호 안에 넣는 것은 어쨌든 잘못된 것이다. 원하는 경우 C++ 11'decltype'을 사용하거나 함수 템플리트를 사용하고'& three'를 전달하여 인수 유형을'int * '로 추론합니다. –
C++은 [형식이 아닌 템플릿 매개 변수를 허용합니다.] (http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fnon -type_template_parameters.htm) – Kietz
['pointer_traits는 :: element_type'] (http://en.cppreference.com/w/cpp/memory/pointer_traits) –
Praetorian
는 http://stackoverflow.com/questions/5628121 – Oktalist