Neat trick - 'with' and unnamed objects + 'with' proposals

Bill Baxter dnewsgroup at billbaxter.com
Mon Apr 23 19:18:21 PDT 2007


I just discovered this little trick that I think is way cool.
You can use 'with' in combination with an anonymous object to set 
attributes on that object without having to bother giving it a name or a 
variable.


with(new someGUIWidget(myParent)) {
    shown = true;
    focusable = false;
}

That's really nifty for GUI code.

This could be even more useful if there were some kind of 'this' for 
'with' blocks.  Then you could also call non-member functions.

with(new someGUIWidget(myParent)) {
    shown = true;
    focusable = false;
    some_global_function(this);
}

Or perhaps analogous to how constructors are called 'this()' and have a 
'this' pointer, we'd have a 'with' pointer so that the meaning of 'this' 
in a class wouldn't be shadowed:

with(new someGUIWidget(myParent)) {
    some_global_function(with);
}

And even cooler would be if you could have a 'with-expression' that just 
evaluates to the thing in the parens:

auto obj = with(new someGUIWidget(myParent))
{
    shown = true;
    focusable = false;
    some_global_function(this);
};


Sometimes I've seen people try to make APIs in C++ where all the 
attribute setters return the object so that property setting can be 
chained, like:

      myObject.set_focusable(true).set_shown(true);

Presumably the objective is to avoid repeating the name of the object a 
lot.  But that never works out too well, because making every mutator 
return a pointer to 'this' is just not so practical in the end, and 
forcing every property setting operation to use function call syntax is 
also not so great.

--bb



More information about the Digitalmars-d mailing list