2016-04-07 9 views
1

Я хотел бы создать карту с EventHandler из типа Base, но вставить эту карту несколько производных EventHandlers, как например:STL Контейнер с родовым шаблонным базовым типом, принимая производные типы

std::unordered_map<int, EventHandler<Base>*> maap; 
EventHandler<Derived>* e1 = new EventHandler<Derived>(); 
maap.emplace(std::make_pair(1, e1)); 

Это возможно указатели простых объектов, но здесь EventHandler <> - шаблонный объект, поэтому компилятор суетливый о преобразовании. Было бы хорошо, если бы я мог сделать что-то вроде

template <class T> 
std::unordered_map<int, EventHandler<T>> maap; 

Но это не работает, либо ... Есть идеи?

+0

Единственный вариант, который приходит мне на ум, - это вариант варианта, который может содержать все типы EventHandler и использовать карту для этого. Например. вы можете использовать вариант boost для этого – choosyg

ответ

1

Я вроде как придумал решение. Я создал пустой абстрактный класс IEventHandler и унаследовал EventHandler из этого класса. Затем я делаю карту IEventHandler *, и теперь она работает нормально. Он может содержать EventHandler любого типа. Мне нужно найти способ удостовериться, что IEventHandler унаследован только EventHandler и что он относится только к правильному типу T.

2 маленькие обновления: я использовал static_cast, чтобы иметь возможность вызвать метод EventHandlers, и потому, что он бросает на указатель нет дополнительного конструктор копирования называется^_^ Я ограничения, которые могут получен из IEventHandler, давая это частный деструктор и дружелюбный EventHandler

+0

'Мне нужно найти способ убедиться, что IEventHandler наследуется только EventHandler', почему налагают такое ограничение? –

+0

Контроль за предполагаемым использованием. Но я понял, что это не очень хорошее решение. Мне все еще нужно, чтобы IEventHandler имел функцию, которая принимает параметр типа , что снова приводит к моей старой проблеме. Я опубликую обновление, если что-то придумаю. – TurtleMaster

+0

Я закончил тем, что просто сделал static_cast <>, чтобы превратить IEventHandler в EventHandler . Я чувствую себя такой грязной. – TurtleMaster

 Смежные вопросы

  • Нет связанных вопросов^_^