// https://issues.dlang.org/show_bug.cgi?id=20470 alias AliasSeq(Args...) = Args; int g, h; void test0() { static struct S { int a, b; float c = 0, d = 0; alias fields = AliasSeq!(a, b, c, d); alias ints = AliasSeq!(a, b); alias floats = AliasSeq!(c, d); alias reversed = AliasSeq!(d, c, b, a); alias globals = AliasSeq!(g, h); alias properties = AliasSeq!(e, f); @property int e() { return a; } @property void e(int i) { a = i; } @property float f() { return c; } @property void f(float j) { c = j; } } S s; assert(s.fields == AliasSeq!(0, 0, 0, 0)); s.ints = AliasSeq!(1, 2); assert(s.fields == AliasSeq!(1, 2, 0, 0)); s.floats = AliasSeq!(3, 4); assert(s.fields == AliasSeq!(1, 2, 3, 4)); int a, b; float c, d; AliasSeq!(d, c, b, a) = s.reversed; assert(AliasSeq!(a, b, c, d) == AliasSeq!(1, 2, 3, 4)); s.globals = AliasSeq!(30, 40); assert(g == 30 && h == 40); // Propagating `this` to functions and properties within tuples will be a breaking change. // See `test2()` below for an example of existing code that would need to be fixed. //s.properties = AliasSeq!(11, 12); //assert(s.e == 11 && s.f == 12); } class Nested(Vars...) { int a, b; alias outervars = Vars; alias fields = AliasSeq!(a, b); alias all = AliasSeq!(a, b, Vars); } auto makeNested() { static class C { bool b; double d; auto nested() { return new Nested!(b, d)(); } } return new C().nested(); } void test1() { auto n = makeNested(); n.fields = AliasSeq!(1, 2); n.outervars = AliasSeq!(true, 1.3); assert(n.all == AliasSeq!(1, 2, true, 1.3)); } void test2() { // backwards compatibility test for functions within tuples static struct S { void f(); void g(); alias funcs = AliasSeq!(f, g); } S s; alias voidTf = void(); foreach (f; s.funcs) static assert(is(typeof(f) == voidTf)); } void main() { test0(); test1(); test2(); }