如何确定指针转换将被偏移的编译时间

How can I determine compile-time that a pointer cast will be offsetted

本文关键字:编译 时间 何确定 指针 转换      更新时间:2023-10-16

有几种方法可以在运行时检测到这一点,但我找不到一种方法来确定指向类的指针是否会在编译时偏移。

class MyA
{
public:
    int m_memberI;
};
class MyB
{
public:
    double m_memberD;
};
class MyC : public MyA, public MyB
{
};
void main()
{
    MyC myC;
    void* pVoidB = dynamic_cast< MyB* >( &myC );
    if( pVoidB != &myC )
    {
        std::cout << "Offset needed!" << std::endl;
    }
}
// **********************************************************************************
// Ideally, I would prefer something like this
//
// static_assert( std::cast_needs_offset< MyB*, MyC* >::value, "Offset detected!!!" );
// **********************************************************************************

编译器显然有这些信息,但我找不到可以帮助我的type_trait

你有什么诀窍吗?

我发现了关于同一个问题的几个问题。这不是我想要的,我不能使用这些解决方案,但经过大量研究,我认为不可能完成我想要做的事情,因为在模板库级别,每个类的第一个成员都是未知的。

参见:

如何静态断言指针强制转换是琐碎的?

C++,静态检测具有不同地址的基类?

static_assert(offsetof(MyC, m_memberI) == offsetof(MyA, m_memberI));
static_assert(offsetof(MyC, m_memberD) != offsetof(MyB, m_memberD));

不幸的是,这对我的特殊问题毫无用处。