On Wed, Mar 21, 2018 at 6:08 PM, Eric Blake <[email protected]> wrote: > On 03/21/2018 11:59 AM, Marc-André Lureau wrote: >>> >>> Hmm, perhaps by making it "struct {} base"? >>> >>> Or even: >>> >>> struct QObjectCommon { >>> QType type; >>> size_t refcnt; >>> } >>> >>> struct QObject { >>> QObjectCommon base; >>> } >>> >>> struct QString { >>> QObjectCommon base; >>> ... >>> } >> >> >> I fail to see what that solves. You are moving the problem to >> QObjectCommon: we would have to replace all QObject * user to take >> QObjectCommon *, and then we wouldn't solve the problem for >> QObjectCommon. > > > Here, QObjectCommon is never used outside of qobject.h; all existing code > continues to uwe QObject *. But the conversion from QString* or QObject * > to QObjectCommon * is trivial (&obj->base), and the conversion from > QObjectCommon * to the public QObject * is trivial (container_of style > cast). So the QOBJECT() macro becomes comparable to a C++ > reinterpret_cast<>() that converts any descendent of QObjectCommon into > QObject, even if the original type was not QObject; and we never offer a > public API to convert anything into or out of QObjectCommon (it only exists > as a dummy type to make our other casts easier).
What is the QOJECT() macro you proposed with that? thanks -- Marc-André Lureau
