应该用什么来检查C++中的身份?

BCS*_*BCS 5 c++ identity casting

我有两个指向对象的指针,我想以最健壮的方式测试它们是否是完全相同的对象.我明确地不想调用任何operator ==重载,无论使用什么基类,虚基类和多继承,我都希望它能够工作.

我目前的代码是这样的:

((void*)a) == ((void*)b)
Run Code Online (Sandbox Code Playgroud)

对于我的情况,这是有效的.但是,这不适用于这种情况:

class B1 {};
class B2 {};
class C : public B1, public B2 {}

C c;
B1 *a = &c;
B2 *b = &c;
Run Code Online (Sandbox Code Playgroud)

底层的reinterpert_cast,static_cast或者dynamic_cast也不管用.


特别是我希望最终会变得非常简单和有效.理想情况下,它不需要任何分支指令来实现,并且会执行类似的操作,将指针调整到对象的开头并进行比较.

小智 8

如果您的类完全与给定的完全相同,那么这是不可能的,因为在运行时没有足够的信息来重建所需的信息.

如果它们实际上是具有虚函数的多态类,那听起来就像dynamic_cast<void *>是答案.它返回指向派生程度最高的对象的指针.那么你的支票就是dynamic_cast<void *>(a)==dynamic_cast<void *>(b).

见这里的第7段:

http://www.csci.csusb.edu/dick/c++std/cd2/expr.html#expr.dynamic.cast

我怀疑通常的dynamic_cast问题是适用的 - 即,不保证它会很快,你的课程必须是多态的.

这不是我自己使用过的一个功能,我担心 - 但我已经看到它经常被那些我认为广泛支持并且像宣传的那样工作的人建议.