Is there a nice syntax to achieve optional named parameters?

SrMordred patric.dexheimer at gmail.com
Thu Jan 17 01:43:42 UTC 2019


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.
>
> I'd ideally like some syntax like this :-
>
> auto window = Window(title = "My Window", width = 1000, 
> fullscreen = true);
>
> Assume that title, width, fullscreen are optional and if not 
> specified there are defaults to use. And that there are many 
> other settings than just these 3 that I've chosen to just use 
> the default here.
>
> I know that I can't do it like this is D but what is the best 
> way to achieve this kind of thing? I can add properties and 
> then do a specific "create" function to create the underlying 
> win32 window once I'm done but that seems ugly.
>
> auto window = Window();
> window.title = "My Window";
> window.width = 1000;
> window.create();
>
> This is ok, but I'm not so keen on separating the creation and 
> construction like this.
> Is there a better way that's not ugly?

Let me throw this idea here:


struct Config
{
	string title;
	int width;
}

struct Window
{
	this(Config config)
	{
		//use static foreach magic to set everything :P
	}
}

auto NewWindow( alias code )()
{
	mixin("Config config = {"~code~"};");
	return Window(config);
}

//usage:
auto a = NewWindow!q{ title : "MainTitle" };
auto b = NewWindow!q{ title : "MainTitle", width : 800 };
auto c = NewWindow!q{ width : 1000 };
auto d = NewWindow!q{};


:)


More information about the Digitalmars-d-learn mailing list