Is there a nice syntax to achieve optional named parameters?

Simen Kjærås simen.kjaras at gmail.com
Mon Jan 21 07:57:58 UTC 2019


On Saturday, 19 January 2019 at 14:26:31 UTC, Zenw wrote:
> On Tuesday, 15 January 2019 at 11:14:54 UTC, John Burton wrote:
>> As an example let's say I have a type 'Window' that represents 
>> a win32 window. I'd like to be able to construct an instance 
>> of the type with some optional parameters that default to some 
>> reasonable settings and create the underlying win32 window.
>>
>> [...]
>
> how about this
>
> auto With(string code,T)(T value)
> {
>     with(value)
>     {
>         mixin(code ~";");
>     }
>     return value;
> }
>
> auto window = Window().With!q{title = "My window",width = 
> 800,fullscreen = true};

The problem with using string mixins like that is when you want 
to use some local variable:

int width = getWidth();
auto window = Window().With!q{width = width};

This would work:

struct Window {
     string title;
     int width;
     bool fullscreen;
}

auto With(T, Args...)(T ctx, Args args) {
     static foreach (i; 0..Args.length) {
         mixin("ctx."~Args[i].name~" = args[i].value;");
     }
     return ctx;
}

struct args {
     static opDispatch(string _name, T)(T value) {
         struct Result {
             enum name = _name;
             T value;
         }
         return Result(value);
     }
}

unittest {
     auto window = Window().With(args.title = "My window", 
args.width = 800, args.fullscreen = true);
     assert(window.title == "My window");
     assert(window.width == 800);
     assert(window.fullscreen == true);
}

However, I don't see that there's all that much gain compared to 
just assigning the fields the normal way.

--
   Simen


More information about the Digitalmars-d-learn mailing list