2012-12-06 2 views
3

구성 유형을 가져옵니다 위의 프로그램은 방금 출력을 보냈습니다 - i.템플릿 클래스가 갖는

편집 :

는 클래스 멤버 (즉이 m_val)없이 관련하여 (즉 INT 또는 I) 유형을 얻을 수 있습니까?

답변

5

typeid::name이 반환하는 이름은 컴파일러에 따라 다르며 일부 컴파일러의 경우 무언가 끔찍한 것입니다 (예 : i : int). 대부분의 컴파일러는 이름의 붕괴를 지원하여 더 나은 표현을 유도하지만 프로그래밍 방식으로는 쓸모가 없습니다.

+0

고마워, 나는 하나 더 관련된 질문을 추가했다. 당신의 도움은 환영받을 것이다 – URL87

+0

그것은 보통 무서운 무언가가 아니다. 대부분의 컴파일러는 유용한 것을하려고합니다. g ++가 유일한 예외 인 것처럼 보입니다. –

+0

@JamesKanze 네, 저는 과장하고 있다고 생각합니다. 나는 그 문장을 조금 더 온화하게 만들었다. – pmr

1

"내가"유형 "INT"이 될 수있는 올바른 이름은 다음과 같습니다

일반적인 컴파일러에 대한 API를 디맹 글링의 목록입니다? 이름뿐입니다! 그 이름으로 무엇을하고 싶니? 당신의 마지막 질문에 대한 응답으로

int main() { 
    C_Type<int> a ; 
    int test=0; 
    if(typeid(a.m_val) == typeid(test)) 
     cout <<"Int"<<endl; 
} 
3

은 (구성원을 참조하지 않고 유형 을 받고 관한) : 없음. 표준 라이브러리에서 구체화 유형 및 그것에 파생 된 유형에 typedef을 제공하는 규칙이 있습니다. 보통 이름 은 value_type이지만 예외 (예 : std::map)가 있습니다. (공용 멤버로)

typedef T value_type; 

클래스에, 그리고 당신이 원하는 때 참조 : 경우에 당신은 추가해야한다, (나쁜 생각하지 않은)이 규칙에 을 준수 할 어떤 임의의 멤버 (또는 이 없을 수도 있음)가 아닌 템플릿 사양에서 템플릿 매개 변수를 검색해야하는 경우

0

(그리고 당신이 C++ 11),이 작업을 수행 할 수 있습니다

template <template <typename> class Templ, typename T> 
T typeGetter(Templ<T>); 

를 그런 다음 주에 :

int main() { 
    C_Type<int> a; 
    decltype(typeGetter(a)) i = 7; //declares i to be int 
} 
관련 문제