代码之家  ›  专栏  ›  技术社区  ›  Jean-Simon Brochu

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

  •  0
  • Jean-Simon Brochu  · 技术社区  · 10 年前

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

    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。

    你的袖子上有什么花样吗?

    1 回复  |  直到 10 年前
        1
  •  0
  •   Community CDub    7 年前

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

    参见:

    How to do a static assert that a pointer cast is trivial?

    C++, statically detect base classes with differing addresses?

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

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