【发布时间】:2011-01-15 14:29:25
【问题描述】:
说B 和C 派生自A。我希望能够测试从A 派生的任何两个类实例是否是同一类的实例,即A* foo 和A* bar 是否都指向B 实例,而不使用RTTI。我目前的解决方案是这样的:
class A {
protected:
typedef uintptr_t Code;
virtual Code code() const = 0;
}; // class A
class B : public A {
protected:
virtual Code code() const { return Code(&identity); }
private:
static int identity;
}; // class B
class C : public A {
protected:
virtual Code code() const { return Code(&identity); }
private:
static int identity;
}; // class C
使用这种方法,operator== 可以简单地测试first.code() == second.code()。我想从派生类中删除文字identity 并让A 自动找到代码,这样并非所有派生类都必须重复这个习语。同样,我强烈不希望使用 RTTI。有没有办法做到这一点?
【问题讨论】:
-
如果你不使用 RTTI,你注定要重新发明它。不完美。
-
出于好奇:您为什么更喜欢使用这种方法而不是使用 RTTI?
-
@nobugz:我不会重新发明整个事情;我只模拟了我会从更大的内置功能中使用的一个功能。 @Laurence:这个项目必须能够在任何地方运行。除了比较两个整数之外,我不希望空间开销和运行时开销。
-
RTTI 没有任何功能。它只做一件事,开销非常。
-
@Jon:你真的测量你想要避免的“开销”吗?一旦有了虚拟功能,RTTI 就几乎没有开销。我能想到的唯一一个是每个类 type 一个类对象。除非您的编译器允许您关闭 RTTI(就像 VC 那样),否则无论如何您都会拥有它。