struct B_crtp;
template<class Derived> struct B_crtp_base;
template<class Derived>
struct A_crtp_base {
operator B_crtp_base<B_crtp>();
};
struct A_crtp : A_crtp_base<A_crtp> {
};
template<class Derived> struct B_crtp_base : A_crtp_base<B_crtp_base<Derived>> {};
struct B_crtp : B_crtp_base<B_crtp> {};
template<class Derived>
A_crtp_base<Derived>::operator B_crtp_base<B_crtp>()
{
return B_crtp_base<B_crtp>(); // Whatever, make sure this is set with common A_crtp_base stuff
}
int main()
{
A_crtp a;
B_crtp b;
static_cast< B_crtp_base<B_crtp>& >(b) = a;
return 0;
}
c3RydWN0IEJfY3J0cDsKdGVtcGxhdGU8Y2xhc3MgRGVyaXZlZD4gc3RydWN0IEJfY3J0cF9iYXNlOwoKdGVtcGxhdGU8Y2xhc3MgRGVyaXZlZD4Kc3RydWN0IEFfY3J0cF9iYXNlIHsKICAgIAogICAgb3BlcmF0b3IgQl9jcnRwX2Jhc2U8Ql9jcnRwPigpOwp9OwoKc3RydWN0IEFfY3J0cCA6IEFfY3J0cF9iYXNlPEFfY3J0cD4gewogICAgfTsKCnRlbXBsYXRlPGNsYXNzIERlcml2ZWQ+IHN0cnVjdCBCX2NydHBfYmFzZSA6IEFfY3J0cF9iYXNlPEJfY3J0cF9iYXNlPERlcml2ZWQ+PiB7fTsKCnN0cnVjdCBCX2NydHAgOiBCX2NydHBfYmFzZTxCX2NydHA+IHt9OwoKdGVtcGxhdGU8Y2xhc3MgRGVyaXZlZD4KQV9jcnRwX2Jhc2U8RGVyaXZlZD46Om9wZXJhdG9yIEJfY3J0cF9iYXNlPEJfY3J0cD4oKQp7CiAgICAgICAgcmV0dXJuIEJfY3J0cF9iYXNlPEJfY3J0cD4oKTsgLy8gV2hhdGV2ZXIsIG1ha2Ugc3VyZSB0aGlzIGlzIHNldCB3aXRoIGNvbW1vbiBBX2NydHBfYmFzZSBzdHVmZgp9CgppbnQgbWFpbigpIAp7CiAgIEFfY3J0cCBhOwogICBCX2NydHAgYjsKCiAgIHN0YXRpY19jYXN0PCBCX2NydHBfYmFzZTxCX2NydHA+JiA+KGIpID0gYTsKCiAgIHJldHVybiAwOwp9