Мне нужно создать объект Event
, который будет отправлен системой прослушивания событий. Event
должен иметь следующие свойства:C++ безопасно удаляет полезную нагрузку объекта события с shared_ptr
Event
потенциально могут быть обработаны 0..n объектов слушателя.Event
содержит указатель на пустоту, который может указывать на произвольный объект (полезная нагрузка) (неизвестный тип во время сборки). Слушатель событий преобразуется в соответствующий тип в зависимости отEvent
.- Нужно, чтобы объект полезной нагрузки был (автоматически) удален после того, как событие было отправлено заинтересованным сторонам. Исходный сборщик событий не может освободиться, поскольку событие переходит в очередь asvnc.
- Предположим, что слушатели могут сделать мелкую копию полезной нагрузки при обработке события.
Я реализовал решение here, но AFAIK это приводит к полезной нагрузке должны быть высвобождено (через unique_ptr
) после первого обработчика события.
В приведенном ниже коде, «SetData» пытается принять объект полезной нагрузки (dataObject
) и преобразовать его в shared_ptr
, чтобы нести void* data
. getData
делает «обратный»:
class Event {
public:
std::string name;
Event(std::string n = "Unknown", void* d = nullptr) :name(n), data(d) {}
template<class T> void setData(const T dataObject)
{
//Create a new object to store the data, pointed to by smart pointer
std::shared_ptr<T> object_ptr(new T);
//clone the data into the new object
*object_ptr = dataObject;
//data will point to the shared_pointer
data= new std::shared_ptr<T>(object_ptr);
}
//reverse of setData.
template<class T> T getData() const
{
std::unique_ptr<
std::shared_ptr<T>
> data_ptr((std::shared_ptr<T>*) data);
std::shared_ptr<T> object_ptr = *data_ptr;
return *object_ptr;
}
private:
void* data;
};
Wow !, Есть ряд типов и языка указателей особенности здесь, что я не знал, потребуется день или два, чтобы переварить .. – Ken
Не стесняйтесь просить объяснений, поэтому я могу уточнить свой ответ с более подробной информацией. Это поможет будущим читателям;) – wasthishelpful
Прежде всего: почему 'forward()' вызов в ctor, что произойдет, если мы просто назовем setData (dataObject); 'в ctor? – Ken