2011-02-08 14 views
2

私は、さまざまな種類の変数がいくつかあるとしましょう。データ型情報を保存する

int MyInteger; 
double MyDouble; 
char MyChar; 

これらの変数へのポインタは、voidポインタの単一の配列に格納されます。

void* IntegerPointer = &MyInteger; 
void* DoublePointer = &MyDouble; 
void* CharPointer = &MyChar; 

void* PointerArray[] = {IntegerPointer, DoublePointer, CharPointer}; 

データ型情報を並列配列に格納したいと考えています。 type_infoはタスクに適しているようですが、割り当てはサポートされていません。だから私はちょうどこのような何かを行うことはできません。

type_info TypeInfoArray[] = {int, double, char}; 

は、データ型についての情報を格納するための他の方法はありますか?

答えて

5

バリアント型を使用することをお勧めします。私はそれを言いたくはありませんが、boost::variant(または類似のもの)を試してみてください。この並列配列とvoidポインタのものはすべて忘れてください。バリアントの単一の配列は同じことを達成し、よりエレガントです。

+0

特に、ポインターではなく値で保存できるので、より洗練されています。 –

2

typeinfoをご覧ください。次に、型情報をstd :: stringの配列として格納できます。

+0

デコレーションされた名前のデータ型を取得する方法を見ていますが、これを逆の方法で無効なポインタをキャストするために変換する方法はありますか? – Maxpm

0

異なるタイプのシーケンスを保持するコンテナを探している場合は、boost::fusion以上に見てください。

あなたが今、あなたのタイプの融合配列、

fusion::vector<int, double, char> object_array(1, 2.0, 'F'); 

を使用した場合、void *それは完全に安全Typeの

at<0>(object_array); // will provide a reference to the int field 

例えばインデックス0でだ、とないものを手に入れます視覚的に...唯一の欠点は、シーケンス内に持つことができる要素の数に制限があることです(通常、コンパイラによって強制されるテンプレートパラメータの数)。

0

タプルもその仕事をします。

std::tuple<int*,float*> tp (&yourInt, &yourFloat); 
関連する問題