как я могу вставить свои собственные объекты класса в ptr_map от повышения. Объекты являются шаблонными так, я не могу использовать некоторое статическое имя типа в карте. Таким образом, я сделал:
ptr_map<string, any> someMap;
Мой класс наследовал повышение:: noncopyable.
someMap.insert("Test", new MyClass<SomeTemplate>());
Ошибка: ошибка: no matching function for call to ‘boost::ptr_map
.
UPD: я предпочел бы делать некоторую обертку и не использую повышение::любой. так:
class IWrapper { };
class MyClass : public IWrapper { };
ptr_map<string, IWrapper> someMap;
someMap.insert("Test", new MyClass<SomeTemplate>());
Почему это не будет работать (та же ошибка)? Я мог передать наследованный класс в родительский интерфейс. Что случилось?
В большинстве случаев проблемы такого типа должны решаться с помощью общего базового класса. Это тот случай, когда все классы будут использоваться одинаково. Полиморфизм во время выполнения.
Я видел законные причины не разрешать общий базовый класс. В этом случае boost::variant
будет в целом лучше, так как остаются методы для единообразной обработки каждого элемента (посетитель). Полиморфизм времени компиляции.
Я никогда не видел законного применения для boost::any
. Я не говорю, что его нет, но оно настолько редкое, что я никогда с ним не сталкивался.
Тем не менее, попробуйте следующее.
std::map<std::string,boost::any> someMap;
boost::any insanity = new MyClass<SomeTemplate>;
someMap.insert("Test",insanity);
or
boost::ptr_map<std::string,boost::any> someMap;
boost::any* ive_lost_it = new boost::any( new MyClass<SomeTemplate> );
someMap.insert("Test", ive_lost_it );
Сначала вы должны предоставить any* для вашей ptr_map.
Затем ключ должен быть lvalue (из-за проблем с безопасностью исключений).
boost::ptr_map<std::string, any> someMap;
any * p = new any(MyClass<Sometype>);
std::string test = "test";
someMap.insert(test, p);
-- редактировать
.
То же самое, если вы используете класс-обертку. Ключ должен быть lvalue.
Кстати, проблема с классом-оберткой/базовым классом здесь в том, что вы не сможете вернуться к исходному типу (и у вас не будет динамического полиморфизма из-за шаблонного типа).