2012-01-23 8 views
0

私は、boost :: anyを使用して異機種のマップを使用することを推奨しています。私。配列を持つC++異種マップ

map<string,boost::any> 

上記の手法を行っているマップに格納されている配列を格納している人はいますか?

私は、次の操作を行うことができた:

boost::array<char,100> myArr; 
map<string,boost::any> myMap; 
myArr[51] = a; 
myMap["imageData"] = myArr; 

これに伴う問題は、これが二回メモリ内の配列全体を格納しているようだということです。 私は少しそれを変更し、これを行う場合は、次の

boost::array<char,100> myArr; 
map<string,boost::any> myMap; 
myArr[51] = a; 
myMap["imageData"] = &myArr; 

私はどのようにマップの外にデータを取り戻すには考えています。ポインタを作成するにはどうすればよいですか?私はできますか?他の誰かが似たようなことをすることができましたか、それとももっと似たようなやり方をよりエレガントにするためのアイディアがありますか?

元々、私はchar[100]をマップに保存したかったのですが、マップで一度キャストする方法が見つからないことがありました(マップ内のデータを使用するには、適切なタイプにキャストする必要があります)。 char[someSize]をマップから外すことを可能にするソリューションが理想的です。

+0

実際の目標は何ですか? –

+0

@BjörnPollexランタイムパラメータを持つクラスを作成しようとしています。つまり、クラスに定義されている 'int width = 5; 'の代わりに、クラスは' map classMap'を持ち、クラスのユーザは 'classMap [" width "] = 5 ; 'classMapにchar [someSize]の値を格納するのに問題がありますが、これはうまくいきます。例: 'char myChar [1000];' 'classMap [" imageData "] = myChar; はchar [1000]をマップに保存しますが、使用する前にデータをキャストする必要があるため使用できませんそれ。 – imjojo42

答えて

0

あなたが何かやっ例えば、ブースト::いずれかを使用していなかった場合は、次の(私の場合はGCC 4.6)

map<string, vector> myMap; 
myMap["imageData"] = vector(100); 

コンパイラが自動的に余分なコピーを避けるだろう。何らかの理由で、boost :: anyがそれを防止しています。一つの可能​​な解決策は、shared_ptrを使用することです:

typedef boost::array<char, 100> Image; 
map<string, boost::any> myMap; 
myMap["imageData"] = boost::shared_ptr<Image>(new Image()); 

のshared_ptrを使用して容器の中にあなたがあなたの質問に示唆されたとして、実際のポインタを使用していることをより良い解決策になる傾向があります。変数が指し示されていないときにイメージが破棄され、プログラマが手作業でメモリを解放しなくなります。

ただし、イメージのサイズによっては、ローカル変数が範囲外になるまでに2つのコピーがある場合のオーバーヘッドがあまり高くないことがあります。したがって、現在のソリューションを維持する可能性も考慮する必要があります。

関連する問題