[Development] RFC: RAII for property changes

Andre Somers andre at familiesomers.nl
Wed Apr 15 21:19:31 CEST 2015


On 15-4-2015 21:05, Keith Gardner wrote:
>
>     >  QPropertyGuard g{this};
>     >   g.addProperty("a"); // use QObject::property
>     >   g.addProperty("b", m_b); // take value member by reference
>     >   g.addProperty(m_c, &cChanged); // ...and also slot address
>
>     There's type erasure going on, so it will allocate memory.
>     Allocating memory
>     in a setter that might just change an int is what I call inefficient.
>
>
> Would something like this be better?
>
> // constructor
> // Provide an initial value and a std::function to notify about the change
> Property<bool> m_example = Property<bool>(false, [&](bool value){
>     emit exampleChanged(value);
> });
>
> // getter
> bool *::example() const {
>     return m_example;
> }
>
> // setter
> void *::setExample(bool value) {
>     m_example = value;
> }
>
> The working code for this example can be found 
> https://github.com/kreios4004/Property_Class.
>
Thank you for posting that.

I took a look at it, but I am not sure it actually solves much. It moves 
the check if something changed to the wrapped variable, but it makes 
using that value then more complicated. Instead of using the variable 
directly, one now has to go through m_example.getValue() everywhere. Not 
pretty, I think. The case of modifying more than one property in one go 
is also not solved. On the one hand, dependent properties (such a 
isValid property) are not updated unless you manually write that code 
again, and on the other hand if you use this to set more than one 
property in a method, you still are sending signals at the point the 
class is in an inconsistent state.

One nice side effect of my implementation is that the notification is 
actually only send once. Even if the property value is changed multiple 
times in the meantime, you still get only one notification. That can be 
very convenient, even if you don't use it much.

André

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/development/attachments/20150415/606d1c0d/attachment.html>


More information about the Development mailing list