2012-03-20 1 views
0

boost::variant에 넣은 원본 객체의 typename을 되 찾도록 도와 주시겠습니까?원래 유형의 부스트 변형 변수를 다시 가져 오는 중

내가 가진이

typedef boost::variant<macro,module> ref_var; 

같은은 원래 객체의 유형 이름을 다시 얻을 수 있습니까? 이 경우 (매크로 또는 모듈)

나는 그것이

typeid(v).name() 

를 사용하여 얻을려고하지만, 그것은 나에게 매크로 나 모듈도 아닌 이상한 이름을 제공합니다

PN5boost7variantI5macro6moduleNS_6detail7variant5void_ES5_S5_S5_S5_S5_S5_S5_S5_S5_S5_S5_S5_S5_S5_S5_S5_S5_EE

도와 주시겠습니까?

+0

이 컴파일러에 의해 엉망이 유형의 이름입니다. 달성하고자하는 것이 무엇입니까? 'rev_var'와'v'가 같은 것입니까? –

+0

안녕하세요 Rafal, rev_var는 변형 유형이고 v는 매크로 또는 모듈 중 하나 일 수있는 변수입니다. –

답변

1

, 당신은 당신의 자신의 솔루션을 롤백 할 수 있습니다 :

const char* ref_var_typename(const ref_var& v) { 
    static const char* types[] = { "macro", "module" }; 
    return types[v.which()]; 
} 
+0

+1, 훌륭한 솔루션 (값으로 'v'를 사용하지 말고 const- 참조로 받아 들여야 함). – ildjarn

+0

@ildjarn 좋은 지적. – Ferruccio

+0

감사합니다. Ferruccio와 ildjarn은 깨끗한 해결책입니다. –

3

variant::type() 변형의 내용은 std::type_info을 반환합니다. 이 방법을 사용하여 변형에 대한 행동 방법을 선택하지 마십시오. 방문자에게 가장 적합합니다.

+0

안녕하세요 고양이, 변형에 대한 유형 이름을 가져 오는 것에 동의하지 않습니다. 이것을 할 수있는 방법이 있습니까? 보여 주시겠습니까? –

+1

@Binh : 답변에 아직없는 것은 무엇입니까? – ildjarn

+0

안녕하세요, v.type() .name()을 사용하지만 v가 'ref_var *'가 아닌 클래스 유형이라는 오류가 발생합니다. –

0

variant이든 아니든 의 실제 C++ typename을 유형으로 가져 오는 방법은 없습니다. 당신이 할 수있는 최선은 type_info을 얻는 것입니다,하지만 알다시피, 그것은 mangled 이름이지 실제 C++ typename이 아닙니다. 당신이 필요로하는 모든이 변형에서 개최 된 유형의 텍스트 표현을 돌아 가야하는 경우

관련 문제