2012-03-20 87 views
0

请您帮我找回放入boost::variant的原始对象的类型名称吗?找回原始类型的提升变量变量

我有这样的事情

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'是同一件事情吗? – 2012-03-20 20:07:03

+0

嗨Rafal,rev_var是变体类型,v是可以是宏或模块的变量。 – 2012-03-20 20:12:31

回答

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 2012-03-21 00:56:25

+0

@ildjarn好点。 – Ferruccio 2012-03-21 01:01:37

+0

非常感谢Ferruccio和ildjarn,这是一个干净的解决方案。 – 2012-03-21 02:01:28

3

variant::type()返回std::type_info该变体的内容。只是不要用它来选择如何在变体上采取行动 - 这最好是由访问者完成。

+0

嗨猫,我不会做任何事情接受获取变体的类型名称回来。有没有办法做到这一点?你能告诉我吗? – 2012-03-20 20:17:48

+1

@Binh:你还需要什么,那还不是答案吗? – ildjarn 2012-03-20 20:20:33

+0

嗨,我使用v.type()。name(),但它给了我错误说v是非类类型'ref_var *' – 2012-03-20 20:37:44

0

没有办法(在标准中)获得实际的C++类型名称任何类型,无论是否来自variant。你可以做的最好的是得到type_info,但正如你所看到的那样,这是错误的名称,而不是实际的C++类型名称。