【发布时间】:2016-11-28 11:56:09
【问题描述】:
我需要创建一个Event 对象以由事件侦听器系统分派。 Event 需要具有以下属性:
-
Event可能由 0..n 个侦听器对象处理。 -
Event包含一个 void 指针,它可以指向任意对象(有效负载)(构建时的未知类型)。事件侦听器将根据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;
};
【问题讨论】:
标签: c++ c++11 events smart-pointers