如何确定指针转换将被偏移的编译时间
How can I determine compile-time that a pointer cast will be offsetted
有几种方法可以在 运行 时检测到这一点,但我找不到确定指向 class 的指针是否会在编译时偏移的方法。
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 可以帮助我的信息。
有什么妙招吗?
我发现了几个关于同一个问题的问题。这不是我想要的,我不能使用这些解决方案,但经过大量研究,我认为不可能完成我想做的事情,因为每个 class 的第一批成员在模板库级别是未知的。
参见:
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));
不幸的是,这对我的特定问题没有用。
有几种方法可以在 运行 时检测到这一点,但我找不到确定指向 class 的指针是否会在编译时偏移的方法。
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 可以帮助我的信息。
有什么妙招吗?
我发现了几个关于同一个问题的问题。这不是我想要的,我不能使用这些解决方案,但经过大量研究,我认为不可能完成我想做的事情,因为每个 class 的第一批成员在模板库级别是未知的。
参见:
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));
不幸的是,这对我的特定问题没有用。