2009-03-01 19 views
0

私は識別子< =>構造体のペアの静的マップを取得しています。各構造体には配列が含まれている必要があります。コンパイル時にはすべてが分かっています。つまり、私はここにこのようなものを持っています:可変長の配列で構造体を静的に初期化する

ID1 => name: someString 
     flagCount: 3 
     flags: [1, 5, 10] 

静的に(可能な場合)作成します。もちろん、のような宣言:

struct Info 
{ 
    const char* name; 
    int flagCount; 
    int flags[]; 
}; 

は限り私は...のように私を除いて、様々な長さの配列に起因することはできません

Info infos [] = { ... }; 

を、(それを初期化する可能性があるので、理想的です何かが足りない)。あるいは、私は約(ab)boost::assignを使っていますが、これに推奨される解決策があるかどうかは疑問です。私は情報構造体だけを配列に格納し、他の場所にマッピングすることができればうまくできます。

編集:現在の解決策に関するメモ。現時点では、私が持っている:

struct Info 
{ 
    Info (const std::vector<int>& flags) : flags {} 
    std::vector<int> flags; 
}; 

と私が使用します(?テンプレートベース)

作品
const std::map<ID, Info> map = boost::assign::map_list_of 
    ("ID1", Info (boost::assign::list_of (1)(2)(3)); 

、私は簡単な解決策があるかどうかだけ興味があります。

+0

コンパイル時に配列内の各Infoオブジェクトのフラグ配列の長さを知っていますか? – dirkgently

+0

はい。ただし、異なるInfosでは異なります。 – Anteru

答えて

1

配列内の要素のサイズは同じでなければなりません。そうでなければ、infos[i]を使用してアクセスすることはできません。コンパイラは配列をステップ実行し、各要素のサイズをiまで次の場所がどこから始まったかを見つけてください。各要素に十分なメモリを連続して割り当て、要素へのポインタの配列を作成できます(ポインタは固定サイズです)。あなたがマッピングだけを必要とし、情報を索引付けしない場合は、マップはポインタの識別子になります。

また、コンパイル時のサイズを知っているので、わずかなフラグしかない場合は、Info::flags配列を最大フラグに十分に大きくするか、またはフラグの配列へのポインタにしてInfoがa固定サイズの構造体。

+0

私は、コンパイル時にboost :: mpl :: vectorのようなものを使用し、型自体に情報を移動することで、さまざまな長さの要素を持つ配列を作成できることは確かです。 – Anteru

1

いずれ可変長配列へのポインタを使用する:

struct Info 
{ 
    const char* name; 
    int flagCount; 
    int *flags; 
}; 

またはすべてのフラグを保持するのに十分な大きさの固定サイズアレイ:

struct Info 
{ 
    const char* name; 
    int flagCount; 
    int flags[MAX_FLAGS]; 
}; 

両方の溶液は、いくつかのメモリを無駄にします。しかし、解法1では構造体ごとにポインタが1つしかありません。このソリューションを名前フィールドに暗黙的に使用していることに注意してください。

1

あなたが行ったようにベクトルを使用することは、ほぼ確実に最良の解決策です。 oefeは、Info自身に間接参照を含めるソリューションを提供しました。もう1つのオプションは、map<ID, Info*>(または昇格map<ID, shared_ptr<Info> >を使用しているため)のように間接的にInfoを定義することです。実際にはこれをしないでください。ベクトルを使用します。それは最高の解決策です。

struct Info { 
    const char *name; 
    int flagCount; 
    int flags[1]; // this is cheating... 
}; 

Info* make_info(int count) { 
     char *buf = new char[sizeof(Info) + (sizeof(int) * (count - 1))]; 
     Info *rv = static_cast<Info*>(static_cast<void*>(buf)); 
     rv->flagCount = count; 
} 
関連する問題