[Development] QProperty and library coding guide

Thiago Macieira thiago.macieira at intel.com
Sun Jul 19 20:42:46 CEST 2020


On Sunday, 19 July 2020 08:20:01 PDT Thiago Macieira wrote:
> 1. Revert the feature.
> 2. Write papers to add necessary functionality to C++23, like reversing a
>    pointer-to-member-object back to the containing object
> 3. Require C++23 in Qt 7.0
> 
> double Square::_qt_property_api_width::value() const
> {
>     return retrieveContainer<&Square::width>(this)->d->width;
> }

I've dug up my old idea of pointer-to-container. This can be implemented as a 
standard library feature, without a core language change. 

Here's a test implementation modernised with C++17 NTTPs:
	https://gcc.godbolt.org/z/GGGE1c
I *believe* it has no UB but does rely on implementation-defined behaviour of 
a PMO. This IB works for QObject because we don't allow virtual inheritance 
and also because by construction the type is only done on the class that 
introduced the member. A generic solution of PMO reversal requires more work.

In that sense, Peppe's suggestion of C++17 offsetof is better.

The important detail is here:
    static Klass *memberToContainer(Type pmo, ConstMemberType *member)
    {
        quintptr memberAddress = quintptr(member);
        typename QIntegerForSizeof<Type>::Signed offset;
        memcpy(&offset, &pmo, sizeof(offset));
        quintptr containerAddress = memberAddress - offset;
        return reinterpret_cast<Klass *>(containerAddress);
    }

The memcpy is IB. The containerAddress calculation is the same as in the code 
currently generated by moc, which I initially claimed to be UB, but now I'm 
not sure.

-- 
Thiago Macieira - thiago.macieira (AT) intel.com
  Software Architect - Intel System Software Products





More information about the Development mailing list