| struct A |
| { |
| ulong i; |
| void foo(ulong a) |
| { |
| i = a; |
| } |
| |
| void foo(string s) |
| { |
| i = s.length; |
| } |
| |
| void bar(T)(T a) |
| { |
| i = a; |
| } |
| |
| void bar(T : string)(T s) |
| { |
| i = s.length; |
| } |
| } |
| |
| alias ai = A.i; |
| alias afoo = A.foo; |
| alias abar = A.bar; |
| alias abar_ulong = A.bar!ulong; |
| alias abar_string = A.bar!string; |
| |
| struct B |
| { |
| A a; |
| } |
| |
| alias ba = B.a; |
| |
| template T(alias x) |
| { |
| void set(int n) |
| { |
| x = n; |
| } |
| } |
| |
| mixin template M(alias x) |
| { |
| void set(int n) |
| { |
| x = n; |
| } |
| } |
| |
| struct C |
| { |
| int i; |
| alias t = T!i; |
| mixin M!i m; |
| } |
| |
| alias ct = C.t; |
| alias ctset = C.t.set; |
| alias cm = C.m; |
| alias cmset = C.m.set; |
| |
| |
| // adapted from https://thecybershadow.net/d/dconf2017/#/21 |
| struct S { string a, b, c; } |
| |
| static string printField(alias field)() |
| { |
| S s = { a: "aa", b: "bb", c: "cc" }; |
| return __traits(child, s, field); |
| } |
| |
| void main() |
| { |
| auto f = printField!(S.b)(); |
| assert(f == "bb"); |
| |
| A a; |
| __traits(child, a, ai) = 3; |
| assert(a.i == 3); |
| assert(__traits(child, a, ai) == 3); |
| __traits(child, a, afoo)(2); |
| assert(a.i == 2); |
| __traits(child, a, afoo)("hello"); |
| assert(a.i == 5); |
| __traits(child, a, abar)(6); |
| assert(a.i == 6); |
| __traits(child, a, abar_ulong)(7); |
| assert(a.i == 7); |
| __traits(child, a, abar_string)("hi"); |
| assert(a.i == 2); |
| |
| __traits(child, a, A.i) = 7; |
| assert(a.i == 7); |
| __traits(child, a, A.bar)(3); |
| assert(a.i == 3); |
| __traits(child, a, A.bar!ulong)(4); |
| assert(a.i == 4); |
| __traits(child, a, __traits(getMember, A, "i")) = 5; |
| assert(a.i == 5); |
| __traits(child, a, __traits(getOverloads, A, "bar", true)[1])("hi!"); |
| assert(a.i == 3); |
| |
| B b; |
| __traits(child, b.a, ai) = 2; |
| assert(b.a.i == 2); |
| __traits(child, __traits(child, b, ba), ai) = 3; |
| assert(b.a.i == 3); |
| |
| C c; |
| __traits(child, c, ct).set(3); |
| assert(c.i == 3); |
| __traits(child, c, ctset)(4); |
| assert(c.i == 4); |
| __traits(child, c, cm).set(5); |
| assert(c.i == 5); |
| __traits(child, c, cmset)(6); |
| assert(c.i == 6); |
| } |