2012-01-23 2 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; 

Я понятия не имею, как получить данные обратно из карты. Как я могу создать указатель boost::array<char,100>? Могу я? Кто-нибудь еще мог сделать что-то подобное или какие-то идеи сделать что-то подобное более элегантным способом?

Первоначально, я хотел сохранить char[100] на карте, но не смог найти способ бросить его один раз на карте (для того, чтобы использовать данные на карте, нужно отдать его правильному типу). Идеальное решение, которое позволило бы мне получить карту char[someSize].

+0

Можете ли вы объяснить, какова ваша фактическая цель? –

+0

@ Björn Pollex Я пытаюсь создать класс с параметрами времени выполнения. т.е. вместо того, чтобы иметь 'int width = 5;', определенный в классе, класс имеет 'map classMap', и пользователь класса может выполнять' classMap ["width"] = 5 ; «Это отлично работает, за исключением того, что у меня есть всевозможные проблемы с сохранением значений char [someSize] в classMap. Например: 'char myChar [1000];' 'classMap [" imageData "] = myChar;' хранит символ [1000] на карте, но использование его невозможно, потому что вам нужно использовать данные, прежде чем сможете использовать Это. – imjojo42

ответ

0

Если вы не использовали повышение :: любой, например, делать что-то вроде:

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 в контейнере, как правило, гораздо лучшее решение, что использование реальный указатель, как вы предлагали в вашем вопросе. Тогда изображение будет уничтожено, если на него не будет указана переменная, что позволит сэкономить программисту от ручного освобождения его памяти.

В зависимости от размера ваших изображений, однако, накладные расходы на наличие двух копий до тех пор, пока локальная переменная не выходит за пределы области видимости, может быть не такой высокой. Поэтому вы должны также рассмотреть возможность сохранения вашего текущего решения.

Смежные вопросы