How to avoid code duplication in static if branches?
Andrej Mitrovic
andrej.mitrovich at gmail.com
Sat Mar 3 20:54:09 PST 2012
You're right it should be able do that dead-code elimination thing.
Slipped my mind. :)
On 3/4/12, Daniel Murphy <yebblies at nospamgmail.com> wrote:
> "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