19-Sep-2013 21:10, Andrei Alexandrescu пишет:
Consider a struct that may or may not have state depending on a type
parameter:

[snip]

Any ideas for a clean solution? I can't get much further than string
mixins, which wouldn't be clean :o).

It seems like s/string/template and we are there.

This works for me:

import std.traits;

struct Static{
    static int method(){ return 21; }
}

struct Instance{
    int v; //so that it "hasState"
    int method(){ return 12; }
}

mixin template Methods()
{
    int method() { return 1 + _theT.method(); }
}

struct S(T)
{
  enum hasState = FieldTypeTuple!T.length || isNested!T;
  static if (hasState)
    T _theT;
  else
    alias _theT = T;
  static if (hasState)
        mixin Methods!();
  else{
    static{
        mixin Methods!();
    }
  }
}

void main()
{
    S!Static s1;
    S!Instance s2;
    assert(S!Static.method() == 22);
    assert(s1.method() == 22);
    assert(s2.method() == 13);
    assert(s1.sizeof == 1);
    assert(s2.sizeof == 4);
}

--
Dmitry Olshansky

Reply via email to