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