我正在为我的事件系统创建一个自定义RTTI系统.以下是EventTypeInfo课程.如您所见,它是不可复制的,就像std::type_info.
class EventTypeInfo
{
public:
EventTypeInfo(const EventTypeInfo&) = delete;
EventTypeInfo& operator=(const EventTypeInfo&) = delete;
inline bool operator==(const EventTypeInfo& other) const {
return this == &other;
}
};
Run Code Online (Sandbox Code Playgroud)
我为每个事件类创建这些对象的方式归结为:
template<class EventClass>
const EventTypeInfo& event::type::info()
{
static EventTypeInfo typeinfo;
return typeinfo;
}
Run Code Online (Sandbox Code Playgroud)
鉴于(1)这些对象是静态创建的(这意味着它们将在应用程序的整个持续时间内持续),(2)它们是不可复制的,并且(3)没有办法在EventTypeInfo不诉诸的情况下修改字段const_cast,是它足以让我实现operator==是条款this == &other,还是我错过了什么?
对于多模块应用程序,我认为每个模块最终可能会拥有自己的静态类型信息对象的副本。因此,如果您的事件可以在模块之间飞行,那么仅仅比较地址可能是不够的。
据我所知,GCC中的RTTI系统过去曾出现过此类问题,并造成了麻烦。最终, GCC 开发人员承认了这一点,并修复在 GCC 4.5 中使用字符串比较。
所以我建议你先进行指针比较,如果失败,再检查更可靠的机制。