[Development] Should QVariant be doing fuzzy comparisons on doubles?

Marc Mutz marc.mutz at kdab.com
Wed Sep 21 12:00:15 CEST 2016


On Wednesday 21 September 2016 11:42:41 Mathias Hasselmann wrote:
> Am 21.09.2016 um 09:52 schrieb Marc Mutz:
> > On Wednesday 21 September 2016 09:23:35 Mathias Hasselmann wrote:
> >> Maybe some clever use of type traits can tell us if your structs contain
> >> alignment wholes?
> > 
> > -Werror=padded :)
> 
> Yes, but how is it supposed to help? Let me show a real world example:
> 
> 	struct Sensor
> 	{
> 	    enum Config { NotInitialized, PullUp, PullDown, Analog };
> 
> 	    Config config;
> 	    QVariant value; //[1]
> 	}
> 
> No matter what order I use for config and value, the compiler will pad
> and -Wpadded will complain. How am I supposed to fix this? This
> solutions that come to my mind all are ugly, but most likely I am just
> stupid.

Tabs? Seriously? :)

 	struct Sensor
 	{
 	    enum Config { NotInitialized, PullUp, PullDown, Analog };
 
 	    Config config;
	    char padding[alignof(QVariant) - sizeof(Config)];
 	    QVariant value; //[1]
 	}

and pray for alignof(QVariant) - sizeof(Config) != 0.

I wasn't serious about -Wpadded, but incidentally, my example shows that type 
traits also won't help. We have a handful of classes in Qt which have a 
'reserved' field that doesn't get initialized (so it better should be named 
'unusable'). A type trait cannot tell if a field called 'padding', 'reserved', 
'unused' or 'unusable' is meant to be part of equality or not.

Thanks,
Marc

-- 
Marc Mutz <marc.mutz at kdab.com> | Senior Software Engineer
KDAB (Deutschland) GmbH & Co.KG, a KDAB Group Company
Tel: +49-30-521325470
KDAB - Qt, C++ and OpenGL Experts



More information about the Development mailing list