Перво-наперво:
template<class myClas>
map<string, myClass> m;
Это недопустимый C ++ и может означать только что-то вроде template alias
, но я считаю, что это не то, что вы ищете.
Хранение полиморфных объектов в C ++ усложняется срезанием (построение значения базового типа из значения производного типа). Динамический полиморфизм может быть обработан только с помощью ссылок или указателей. Вы можете потенциально использовать std::ref
или boost::ref
для ситуаций, в которых карта будет передаваться только по стеку вызовов, но это требует некоторой осторожности. Зачастую хранение указателей на базе - это путь: std::map<std::string, base*>
. Самостоятельное управление освобождением является довольно утомительным занятием, и std::map<std::string, std::unique_ptr>
или std::map<std::string, std::shared_ptr>
предпочтительнее, в зависимости от того, нужна ли вам общая семантика или нет.
Базовый пример. Кто-то должен заменить это чем-то более значимым.
#include <memory>
#include <string>
#include <map>
#include <iostream>
class animal
{
public:
virtual ~animal() {};
virtual void make_sound() const = 0;
};
class dog : public animal
{
public:
void make_sound() const { std::cout << "bark" << std::endl; }
};
class bird : public animal
{
public:
void make_sound() const { std::cout << "chirp" << std::endl; }
};
int main()
{
std::map<std::string, std::unique_ptr<animal>> m;
m.insert(std::make_pair("stupid_dog_name", new dog));
m.insert(std::make_pair("stupid_bird_name", new bird));
m["stupid_dog_name"]->make_sound();
return 0;
}