Function template advice

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Jan 18 14:39:02 PST 2017


On 01/18/2017 02:02 PM, Jordan Wilson wrote:
> I have a simple comparison function:
>
> struct Foo {
>     string bar;
> }
>
> auto sameGroup(T,S) (T a, S b) {
>     static assert (is(T == string) || is(T == Foo));
>     static assert (is(S == string) || is(S == Foo));
>
>     string aStr;
>     string bStr;
>     static if (is(T == string)){
>         aStr = a;
>     } else {
>         aStr = a.bar;
>     }
>     static if (is(S == string)){
>         bStr = b;
>     } else {
>         bStr = b.bar;
>     }
>     return equal (aStr,bStr);
> }
>
> This works, but just wondered if there was an easier way?
>
> Is there a way to do "static if" in shorthand, like:
> auto aStr = (static if (is(T==string)) ? a : a.bar

Yes, can be better with something similar to the following:

struct Foo {
     string bar;
}

string value(U : Foo)(U u) {
     return u.bar;
}

string value(U : string)(U u) {
     return u;
}

auto sameGroup(T,S) (T a, S b) {
     static assert (is(T == string) || is(T == Foo));
     static assert (is(S == string) || is(S == Foo));

     import std.algorithm;
     return equal (value(a), value(b));
}

void main() {
     assert(sameGroup("a", "b") == false);
     assert(sameGroup("a", Foo("a")) == true);
     assert(sameGroup(Foo("x"), "b") == false);
     assert(sameGroup(Foo("z"), Foo("z")) == true);
}

Ali



More information about the Digitalmars-d-learn mailing list