"Andrej Mitrovic" <andrej.mitrov...@gmail.com> wrote in message news:mailman.364.1330825349.24984.digitalmars-d-le...@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.