// http://stackoverflow.com/questions/31878000/static-assertion-that-a-base-pointer-equals-a-derived-pointer
template<typename D, typename B>
struct CheckCasting {
static D d_static;
constexpr
static B* bp = &d_static; // the original object is D,
// that allows us to static_cast both ways
static
constexpr bool static_equals_reinterpret() {
return static_cast<void*>(static_cast<D*>(bp))
== static_cast<void*>( bp );
}
};
struct Base {
constexpr Base() : i(0) {}
int i;
};
struct derived_with_virtual : public Base {
derived_with_virtual() {}
virtual void foo() { }
};
struct without_virtual : public Base {
without_virtual() {}
};
static_assert( ! CheckCasting<derived_with_virtual, Base> :: static_equals_reinterpret() ,"");
static_assert( CheckCasting<without_virtual , Base> :: static_equals_reinterpret() ,"");
int main() {
}
Ly8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zMTg3ODAwMC9zdGF0aWMtYXNzZXJ0aW9uLXRoYXQtYS1iYXNlLXBvaW50ZXItZXF1YWxzLWEtZGVyaXZlZC1wb2ludGVyCgp0ZW1wbGF0ZTx0eXBlbmFtZSBELCB0eXBlbmFtZSBCPgpzdHJ1Y3QgQ2hlY2tDYXN0aW5nIHsgCiAgICBzdGF0aWMgRCBkX3N0YXRpYzsKCiAgICBjb25zdGV4cHIKICAgIHN0YXRpYyBCKiBicCA9ICZkX3N0YXRpYzsgLy8gdGhlIG9yaWdpbmFsIG9iamVjdCBpcyBELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGFsbG93cyB1cyB0byBzdGF0aWNfY2FzdCBib3RoIHdheXMKCiAgICBzdGF0aWMKICAgIGNvbnN0ZXhwciBib29sIHN0YXRpY19lcXVhbHNfcmVpbnRlcnByZXQoKSB7IAogICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx2b2lkKj4oc3RhdGljX2Nhc3Q8RCo+KGJwKSkgCiAgICAgICAgICAgID09IHN0YXRpY19jYXN0PHZvaWQqPiggICAgICAgICAgICAgICAgYnAgKTsKICAgIH0gCn07CgpzdHJ1Y3QgQmFzZSB7IAogICAgY29uc3RleHByIEJhc2UoKSA6IGkoMCkge30KICAgIGludCBpOwp9OwoKc3RydWN0IGRlcml2ZWRfd2l0aF92aXJ0dWFsIDogcHVibGljIEJhc2UgeyAKICAgIGRlcml2ZWRfd2l0aF92aXJ0dWFsKCkge30KICAgIHZpcnR1YWwgdm9pZCBmb28oKSB7IH0gCn07CnN0cnVjdCB3aXRob3V0X3ZpcnR1YWwgOiBwdWJsaWMgQmFzZSB7IAogICAgd2l0aG91dF92aXJ0dWFsKCkge30KfTsKCnN0YXRpY19hc3NlcnQoICEgQ2hlY2tDYXN0aW5nPGRlcml2ZWRfd2l0aF92aXJ0dWFsLCBCYXNlPiA6OiBzdGF0aWNfZXF1YWxzX3JlaW50ZXJwcmV0KCkgICAsIiIpOwpzdGF0aWNfYXNzZXJ0KCAgIENoZWNrQ2FzdGluZzx3aXRob3V0X3ZpcnR1YWwgICAgICwgQmFzZT4gOjogc3RhdGljX2VxdWFsc19yZWludGVycHJldCgpICAgLCIiKTsKCmludCBtYWluKCkgeyAKfQo=