C++ 如何确定指针强制转换将偏移的编译时间

C++ 如何确定指针强制转换将偏移的编译时间,c++,casting,multiple-inheritance,typetraits,static-assert,C++,Casting,Multiple Inheritance,Typetraits,Static Assert,有几种方法可以在运行时检测到这一点,但我找不到一种方法来确定指向类的指针是否会在编译时偏移 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* >(

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

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!!!" );
// **********************************************************************************
编译器显然有这方面的信息,但我找不到一种类型特性可以帮助我


你有什么窍门吗?

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

见:


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

与模板元编程不同,您是否尝试过基于constexpr的解决方案?听起来是个主意,我会在找到支持它们的编译器后立即尝试。非常感谢。
static_assert(offsetof(MyC, m_memberI) == offsetof(MyA, m_memberI));
static_assert(offsetof(MyC, m_memberD) != offsetof(MyB, m_memberD));