0

Существует несколько способов обнаружить это во время выполнения, но я не могу найти способ определить, будет ли указатель на класс смещен во время компиляции.Как определить время компиляции, которое будет отбрасывать указатель стрелки

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!!!"); 
// ********************************************************************************** 

У компиляторов, очевидно, есть эта информация, но я не могу найти тип_трейта, который мог бы мне помочь.

Любой трюк с вашими рукавами?

+0

Вместо того, чтобы мета-программирование шаблона, вы пробовали решение 'constexpr'? – John

+0

Похоже на идею, я попробую это, как только я получу руку на компиляторе, который их поддерживает. спасибо –

ответ

0

Я нашел несколько вопросов по этой же проблеме. Это не то, что я хочу, и я не могу использовать эти решения, но после многих исследований я думаю, что невозможно выполнить то, что я пытаюсь сделать, потому что первые члены каждого класса неизвестны на уровне библиотеки шаблонов.

См:

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)); 

К сожалению, это бесполезно для моей конкретной проблемы.