2012-01-23 25 views
0

我看到有人建议使用boost ::任何有异类地图。即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; 

我不知道如何找回数据出来的图。我如何创建一个boost::array<char,100>指针?我可以吗?是否有其他人能够做类似的事情或有什么想法以更优雅的方式做类似的事情?我想在地图中存储一个char[100],但是我无法在地图中放置一次(为了在地图中使用数据,必须将其转换为适当的类型)。一个解决方案,可以让我得到一个char[someSize]出地图将是理想的。

+0

你能解释一下你的实际目标是什么? –

+0

@比约恩博动我想创建与运行参数的类。即代替具有一个'INT宽度= 5;'在类定义的,类有一个'映射<串,升压::任何> classMap'和类的用户可以做'类映射[“宽度”] = 5 ;'这工作正常,除了我在类映射中存储char [someSize]值时遇到各种麻烦。例如: '炭myChar [1000];' '类映射[“的imageData”] = myChar;' 存储炭[1000]在地图,并使用它是不可能的,因为你需要转换数据才可以使用它。 – imjojo42

回答

0

如果你没有使用boost ::任何,例如做这样的事情:

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

(在我的情况GCC 4.6),编译器会自动避免额外的副本。出于某种原因,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往往是使用一个真正的指针你在你的问题建议一个更好的解决方案。当没有变量指向它时,图像将被销毁,从而使程序员不用手动释放其内存。

根据您的图像的大小,但是,有两个副本,直到局部变量的开销超出范围可能不会那么高。所以你也应该考虑保留你当前的解决方案的可能性。