2012-03-20 4 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'は同じですか? –

+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

実際のC++の型名をのvariantであるかどうかにかかわらず取得する方法はありません。できるだけ良いのはtype_infoですが、わかるように、それは実際のC++の型名ではなく、変更された名前です。あなたが必要とするすべてのバリアントで開催されたタイプのテキスト表現を取り戻すのであれば

関連する問題