2010-06-17 6 views
7

Как я могу вставить свои собственные объекты класса в ptr_map из boost. Объекты шаблоны, поэтому я не могу использовать какое-то статическое имя на карте. Так что я сделал:Boost any usage

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>()); 

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

ответ

3

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

Я видел законные причины, чтобы не допускать общий базовый класс. В этом случае boost::variant, как правило, лучше работает, так как есть еще методы для обработки каждого элемента равномерно (посетитель). Полиморфизм времени компиляции.

Я никогда не видел законного использования для boost::any. Я не говорю, что их нет, но это так редко, что я никогда не сталкивался с этим.


Это, пожалуйста, попробуйте это.

std::map<std::string,boost::any> someMap; 
boost::any insanity = new MyClass<SomeTemplate>; 
someMap.insert("Test",insanity); 

или

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); 
+0

Мои шаблоны. Я обновил образец. Я не могу создать базу для нее (без шаблона). – Ockonal

+0

Хорошо, спасибо. Путь с кем-то должен работать. Но можете ли вы взглянуть на новое обновление кода? Я попытался реализовать твою первую идею. – Ockonal

1

Сначала вы должны предоставить любую * к вашему 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.

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

+0

Что означает «lvalue»? Не могли бы вы показать пример? – Ockonal

+0

lvalue означает назначаемый (а не const). «test» не назначается, а const, std :: string test, однако, является значением lvalue. – log0