2012-06-26 2 views
0

매크로에 전달 된 포인터에서 클래스 유형을 추출하려고합니다. 여기 내가 지금까지 가지고있는 것입니다컴파일시 포인터 유형 결정

template <class CLASS> class getter 
{ 
public: 
    typedef CLASS type; 
}; 
template <class CLASS> getter<CLASS> func(const CLASS* const) 
{ 
    return getter<CLASS>(); 
} 
... 
#define GETTYPE(PTR) func(p)::type 
... 
MyClass *p = new MyClass; 
... 
GETTYPE(p) myClass; 

이것도 가능합니까? 내가 틀린 나무를 짖고 있니?

+0

기본적으로 원하는 것은 템플릿에서 포인터를 제거하는 것입니다. –

+1

'std :: remove_pointer <> :: type'? – ildjarn

+0

네, 그렇지만 포인터 타입이 아닙니다. – cppguy

답변

2

.

+0

Visual Studio 2005를 사용 ... 불행히도 decltype 없습니다. 그게 내가 재현하려는거야. – cppguy

1

예 아니요. 을 알고있는 일반 유형에서 추출 할 수 있습니다. 템플릿은 뾰족한 유형입니다. 그러나 당신은 기능으로 그것을 할 수 없습니다.

template <typename T> 
struct remove_ptr {  // Non pointer generic implementation 
    typedef T type; 
}; 
template <typename T> 
struct remove_ptr<T*> { // Ptr specialization: 
    typedef T type; 
}; 

사용 : 간단한 구현은이의 라인에서 구현, C++ 11 std::remove_pointer 당신이 C++ 11 decltype을 사용할 수 있습니다

template <typename T> void foo(T x) { 
    typedef typename remove_ptr<T>::type underlying_type; 
} 
int main() { 
    foo((int*)0); // underlying_type inside foo is int 
    foo(0);  // underlying_type inside foo is also int 
} 
+0

불행히도, 그것은 내가 필요한 것이 아닙니다. 위의 예제 에서처럼 포인터가 존재하는 것과 동일한 수준의 형식에 액세스해야합니다. – cppguy

+1

@cppguy : C++은 강력하고 정적으로 형식이 지정된 언어입니다. 변수가 범위에있는 곳에 변수의 유형이 있습니다. 타입을 알고 있기 때문에 포인터를 통해 액세스 할 필요가 없습니다. 당신은 * 어떻게 * 당신이 그 유형을 가질 수 없습니까? –

+0

이 코드를 David의 사용 방법을 보여주기 위해 위의 예제를 업데이트했습니다.매크로가 호출 될 때, 나는 포인터 타입을 모르겠다. – cppguy

1

나는 당신이 틀린 나무를 짖고 있다고 생각합니다. 변수가 있으면 변수가 템플릿 매개 변수 또는 선언을 통해 유형임을 알 수 있습니다. 형식이 이미 선언문에 명시 적으로 표시되어 있으므로 컴파일러에 질문 할 필요가 없습니다. 일관성을 찾고 있다면 함수 블록의 처음에 typedef를 시도하십시오. 형식이 템플릿 매개 변수에서 나온 것이라면 David가 제공 한 제안을 사용하여 포인터 및 참조 한정자를 제거합니다.