Повысить любое использование - PullRequest
7 голосов
/ 17 июня 2010

как я могу вставить свои собственные объекты класса в ptr_map из boost.Объекты являются шаблонными, поэтому я не могу использовать статическое имя типа на карте.Итак, я сделал:

ptr_map<string, any> someMap;

Мой класс наследует boost :: noncopyable .

someMap.insert("Test", new MyClass<SomeTemplate>());

Ошибка: error: no matching function for call to ‘boost::ptr_map.


UPD : Я бы предпочел сделать какую-нибудь оболочку и не использовать boost :: any.Итак:

class IWrapper { };
class MyClass : public IWrapper { };

ptr_map<string, IWrapper> someMap;
someMap.insert("Test", new MyClass<SomeTemplate>());

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

Ответы [ 2 ]

3 голосов
/ 17 июня 2010

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

Я видел законные причины, чтобы не разрешить общий базовый класс. В этом случае 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 );
1 голос
/ 17 июня 2010

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

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

...