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

--
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org

Reply via email to