1
|
1 struct S
|
|
2 {
|
|
3 int i;
|
|
4 int square()
|
|
5 {
|
|
6 return i*i;
|
|
7 }
|
|
8 int plus(int a)
|
|
9 {
|
|
10 return i + a;
|
|
11 }
|
|
12 int minus(int a)
|
|
13 {
|
|
14 return i - a;
|
|
15 }
|
|
16 int delegate(int) get(char op)
|
|
17 {
|
|
18 int delegate(int) rval;
|
|
19 if (op == '+')
|
|
20 rval = +
|
|
21 else if (op == '-')
|
|
22 rval = −
|
|
23 return rval;
|
|
24 }
|
|
25 }
|
|
26
|
|
27 int calldg1(int delegate(int) dg, int i)
|
|
28 {
|
|
29 return dg(i);
|
|
30 }
|
|
31
|
|
32 void delegate() retdg()
|
|
33 {
|
|
34 void delegate() dg;
|
|
35 return dg;
|
|
36 }
|
|
37
|
|
38 void getretdg()
|
|
39 {
|
|
40 void delegate() dg;
|
|
41 dg = retdg();
|
|
42 }
|
|
43
|
|
44 class C
|
|
45 {
|
|
46 int i;
|
|
47 void m()
|
|
48 {
|
|
49 i = 42;
|
|
50 }
|
|
51 }
|
|
52
|
|
53 void getclassdg()
|
|
54 {
|
|
55 scope c = new C;
|
|
56 void delegate() dg = &c.m;
|
|
57 assert(c.i != 42);
|
|
58 dg();
|
|
59 assert(c.i == 42);
|
|
60 }
|
|
61
|
|
62 void main()
|
|
63 {
|
|
64 printf("Delegate test\n");
|
|
65 S s = S(4);
|
|
66
|
|
67 auto dg = &s.square;
|
|
68 //assert(dg() == 16);
|
|
69 //dg();
|
|
70
|
|
71 /*auto dg1 = &s.plus;
|
|
72 assert(dg1(6) == 10);
|
|
73
|
|
74 auto dg2 = &s.minus;
|
|
75 assert(calldg1(dg2,30) == -26);
|
|
76
|
|
77 auto dg3 = s.get('+');
|
|
78 assert(dg3(16) == 20);
|
|
79
|
|
80 getretdg();
|
|
81 getclassdg();*/
|
|
82
|
|
83 printf(" SUCCESS\n");
|
|
84 }
|