How to avoid code duplication in static if branches?

Daniel Murphy yebblies at nospamgmail.com
Sat Mar 3 20:12:42 PST 2012


"Andrej Mitrovic" <andrej.mitrovich at gmail.com> wrote in message 
news:mailman.364.1330825349.24984.digitalmars-d-learn at puremagic.com...
> import std.stdio;
> void check() { writeln("check"); }
>
> struct Foo { bool isTrue = true; }
> struct Bar { }
>
> void test(T)(T t)
> {
>    static if (is(T == Foo))
>    {
>        if (t.isTrue)
>            check();
>    }
>    else
>    {
>        check();
>    }
> }
>
> void main()
> {
>    Foo foo;
>    Bar bar;
>    test(foo);
>    test(bar);
> }
>
> I want to avoid writing "check()" twice. I only have to statically
> check a field of a member if it's of a certain type (Foo).
>
> One solution would be to use a boolean:
> void test(T)(T t)
> {
>    bool isTrue = true;
>    static if (is(T == Foo))
>        isTrue = t.isTrue;
>
>    if (isTrue)
>        check();
> }
>
> But that kind of defeats the purpose of static if (avoiding runtime
> overhead). Does anyone have a trick up their sleeve for these types of
> situations? :)

Have you checked the generated code?  When the static if check fails, it 
should be reduced to:
> void test(T)(T t)
> {
>    bool isTrue = true;
>
>    if (isTrue)
>        check();
> }

And the compiler should be able to tell that isTrue is always true.

Otherwise,

void test(T)(T t)
{
  enum doCheck = is(T == Foo);
  bool isTrue = true;
  static if (is(T == Foo))
    auto isTrue = t.isTrue;
  if (!doCheck || isTrue)
    check();
}

The compiler takes care of it because doCheck is known at compile time. 




More information about the Digitalmars-d-learn mailing list