Повысьте любое использование

как я могу вставить свои собственные объекты класса в 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>());

Почему это не будет работать (та же ошибка)? Я мог передать наследованный класс в родительский интерфейс. Что случилось?

7
задан manlio 27 February 2014 в 12:27
поделиться

2 ответа

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

Я видел законные причины не разрешать общий базовый класс. В этом случае 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 );
3
ответ дан 7 December 2019 в 14:29
поделиться

Сначала вы должны предоставить 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.

Кстати, проблема с классом-оберткой/базовым классом здесь в том, что вы не сможете вернуться к исходному типу (и у вас не будет динамического полиморфизма из-за шаблонного типа).

1
ответ дан 7 December 2019 в 14:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: