2015-03-23 3 views
0

Я пытаюсь создать диспетчер ресурсов (как и тот, который предоставляется в библиотеке Libgdx) для SFML в C++. Но я сталкиваюсь с возрастной проблемой шаблонов, являющейся одной из худших частей C++.Общие объекты карты

Я пытаюсь, чтобы объект объекта карты имел общие типы, ключ был бы простой строкой, и данные были бы любыми типами, которые я хочу, чтобы это было. Обратите внимание: я не хочу, чтобы шаблонный объект просто удерживал один общий тип во всей карте (IE, а карта - <string, int>). Я хочу иметь разные типы на одной карте, чтобы я мог загружать много разных активов.

Есть ли способ сделать что-то подобное?

Благодарим вас за помощь и внимание, любой маленький наконечник проходит долгий путь.

+0

Хорошо, что есть * [Boost Any library] (http://www.boost.org/doc/libs/1_57_0/doc/html/any.html), или, конечно, используя наследование указателей. Но вы могли бы также переосмыслить свой дизайн о том, чтобы один управляющий активами обрабатывал все активы и вместо этого использовал один менеджер для каждого типа активов (и вместо этого имел карту менеджеров). –

+3

Шаблоны - одна из лучших частей C++. Что касается вашей проблемы, вы можете посмотреть http://stackoverflow.com/questions/251403/how-do-you-make-a-heterogene-boostmap –

+0

Спасибо за это! Я проверю это через некоторое время позже, и, наверное, я неправильно сформулировал комментарий к шаблону. Я хотел сказать, что, на мой взгляд, и мнение большинства моих друзей, шаблоны на C++ - одна из самых неприятных и запутанных функций (хотя они очень полезны). –

ответ

0

Я повторяю свой комментарий о редизайне, используя вместо него карту менеджера.

Тогда у вас может быть, например,

class basic_asset_manager { ... }; 
class image_asset_manager : public basic_asset_manager { ... }; 
... 

std::unordered_map<std::string, basic_asset_manager*> asset_managers; 
asset_managers["image"] = new image_asset_manager; 
... 

// Load an image from a file 
asset_managers["image"]->load("some alias for image", "/some/file/name"); 
... 

// Get image 
image = asset_manager["image"]->get("some alias for image"); 

Может быть, не точно, как это, но вы, надеюсь, понимаете.

0

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

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