On Tuesday, 30 October 2018 at 21:19:13 UTC, H. S. Teoh wrote:
On Tue, Oct 30, 2018 at 08:46:31PM +0000, aliak via Digitalmars-d-learn wrote:
[...]

        struct C(Args...)
if ((rest.length == 2 && is(Args[0] == B!C, C) && is(Args[1] == string)) || (rest.length == 1 && (is(Args[0] == B!C, C) || is(Args[0] == string))))
        {
                ...
        }


Hah! Yep. That.


[...]
[...]

This is unnecessary.  Why not just use `void` directly?

Ah true, yes brain fart on my part.

I think it was left overs from a scenario where I didn't want to do this:

static if (!is(T == void)) {
  T variable;
}

Because a Void struct would be declared as well. But then one realises that everywhere you want to use "variable" you need to guard it with a static if so meh.


        struct C(string name, T, string desc)
                if (is(T : B!C, C) || is(T == void))
        {
                ...
        }


[...]
[...]

You can also use default parameters for templates:

        struct C(string name, T, string desc = null)
        {
                ...
        }

then you just need one more alias for the string-only variant:

        alias C(string name, string desc) = C!(name, void, desc);

Note that this syntax is much shorter than the full eponymous template syntax, which makes it easier to deal with longer parameter lists:

Ah nice! Yes that helps indeed :)


struct ManyParams(A a, B b=defaultB, C c=defaultC, D d=defaultD)
        {
                ...
        }
alias ManyParams(A a, C c, D d=defaultD) = ManyParams!(a, null, c, d); alias ManyParams(A a, D d=defaultD) = ManyParams!(a, void, void, d);

And so on.

And there's probably a way to auto-generate those alias templates if you anticipate needing to do this many times. (Or if you're insane and want to let the user specify different arguments in any order.) Mixins and CTFE codegen FTW! :-D

Did I hear "specify different arguments in any order"? -> https://forum.dlang.org/thread/cjbqrpbpymwayzcgc...@forum.dlang.org.

:p

Cheers,
- Ali




T

Reply via email to