2012-03-20 82 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++類型名稱。