我正在为我的活动系统创建一个自定义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;
}
};
我为每个事件类创建这些对象的方法归结为:
template<class EventClass>
const EventTypeInfo& event::type::info()
{
static EventTypeInfo typeinfo;
return typeinfo;
}
鉴于(1)这些对象是静态创建的(这意味着它们将持续整个应用程序的持续时间),(2)它们是不可复制的,(3)无法修改EventTypeInfo
没有诉诸const_cast
的字段,是否足以让我实施operator==
是this == &other
的条款,还是我错过了什么?
答案 0 :(得分:4)
如果您确定每种类型只有一个实例,那么地址比较就可以了。
对于std :: type_info是不够的,因为标准不保证其唯一性。
答案 1 :(得分:2)
对于多模块应用程序,我认为每个模块最终都可能拥有自己的静态类型信息对象副本。因此,如果您的事件可以在模块之间飞行,那么仅仅比较一个地址可能是不够的。
据我所知,RTTI system in GCC had this sort of problem in past,它造成了麻烦。最后,在GCC 4.5中GCC developers admitted it and fixed to use string comparison。
所以我建议你先做指针比较,如果失败了,那就检查一下更可靠的机制。
答案 2 :(得分:1)
在一般情况下,我认为这还不够。
考虑你有两个不同的实例(地址),但是内容/内部相同的情况。
如果它真的是后者,那么也许你的捷径可行:你的捷径确实是一种浅层比较。
例如,如果你可以保证每个事件都有一个 不管怎样,不同的时间戳会导致两个不同的实例 无论如何都要返回false(并且你关心时间戳进行比较 目的),使用捷径会很好。
否则,按正常方式进行(深度比较或至少一级浅比较)。
归根结底,在这种情况下,它取决于你对等于什么的解释/语义。
如果您执行选择比较地址,我建议您对您的实施进行评论,以便您的代码的未来读者能够理解您已经考虑过您的实施,这是真的你的意图。
答案 3 :(得分:0)
你还没有向我们展示足够的课程。没有任何数据成员,没有但地址来确定它们是否相等。如果您的示例中没有包含数据成员,是否可以创建包含相同数据的两个实例?这些实例应该相等吗?