1 #define UN_OP(op) const char* operator op () { return "unary "#op; } 2 #define POST_UN_OP(op) const char* operator op (int x) { x++; return "post "#op; } 3 #define BIN_OP(op) const char* operator op (int x) { x++; return "binary "#op; } 4 #define NONMEMBER_BIN_OP(op) const char* operator op (int x, const TestOps&) { x++; return "nonmember binary "#op; } 5 #define NONMEMBER_BIN_OP2(op) const char* operator op (double x, const TestOps&) { x++; return "nonmember binary2 "#op; } 6 7 #define COMMA , 8 9 class TestOps { 10 11 public: 12 13 UN_OP(-); 14 UN_OP(+); 15 UN_OP(*); 16 UN_OP(~); 17 UN_OP(!); 18 UN_OP(&); 19 20 UN_OP(++); 21 UN_OP(--); 22 POST_UN_OP(++); 23 POST_UN_OP(--); 24 25 BIN_OP(+); 26 BIN_OP(-); 27 BIN_OP(*); 28 BIN_OP(/); 29 BIN_OP(%); 30 31 BIN_OP(<<); 32 BIN_OP(>>); 33 34 BIN_OP(|); 35 BIN_OP(&); 36 BIN_OP(^); 37 BIN_OP(COMMA); 38 39 BIN_OP(==); 40 BIN_OP(!=); 41 BIN_OP(<=); 42 BIN_OP(<); 43 BIN_OP(>=); 44 BIN_OP(>); 45 46 BIN_OP([]); 47 BIN_OP(()); 48 49 }; 50 51 NONMEMBER_BIN_OP(+) 52 NONMEMBER_BIN_OP(-) 53 NONMEMBER_BIN_OP(*) 54 NONMEMBER_BIN_OP(/) 55 NONMEMBER_BIN_OP(%) 56 57 NONMEMBER_BIN_OP(<<) 58 NONMEMBER_BIN_OP(>>) 59 60 NONMEMBER_BIN_OP(|) 61 NONMEMBER_BIN_OP(&) 62 NONMEMBER_BIN_OP(^) NONMEMBER_BIN_OP(COMMA)63NONMEMBER_BIN_OP(COMMA) 64 65 NONMEMBER_BIN_OP2(+) 66 NONMEMBER_BIN_OP2(-) 67 NONMEMBER_BIN_OP2(*) 68 NONMEMBER_BIN_OP2(/) 69 NONMEMBER_BIN_OP2(%) 70 71 NONMEMBER_BIN_OP2(<<) 72 NONMEMBER_BIN_OP2(>>) 73 74 NONMEMBER_BIN_OP2(|) 75 NONMEMBER_BIN_OP2(&) 76 NONMEMBER_BIN_OP2(^) 77 NONMEMBER_BIN_OP2(COMMA) 78 79 80 /* RefTestOps */ 81 82 #define REF_UN_OP(op) int& operator op () { return value; } 83 #define REF_POST_UN_OP(op) int& operator op (int x) { x++; return value; } 84 #define REF_BIN_OP(op) int& operator op (int x) { x++; return value; } 85 86 class RefTestOps { 87 int value = 0; 88 89 public: 90 91 REF_UN_OP(-); 92 REF_UN_OP(+); 93 REF_UN_OP(*); 94 REF_UN_OP(~); 95 REF_UN_OP(!); 96 REF_UN_OP(&); 97 98 REF_UN_OP(++); 99 REF_UN_OP(--); 100 REF_POST_UN_OP(++); 101 REF_POST_UN_OP(--); 102 103 REF_BIN_OP(+); 104 REF_BIN_OP(-); 105 REF_BIN_OP(*); 106 REF_BIN_OP(/); 107 REF_BIN_OP(%); 108 109 REF_BIN_OP(<<); 110 REF_BIN_OP(>>); 111 112 REF_BIN_OP(|); 113 REF_BIN_OP(&); 114 REF_BIN_OP(^); 115 REF_BIN_OP(COMMA); 116 117 REF_BIN_OP(==); 118 REF_BIN_OP(!=); 119 REF_BIN_OP(<=); 120 REF_BIN_OP(<); 121 REF_BIN_OP(>=); 122 REF_BIN_OP(>); 123 124 REF_BIN_OP([]); 125 REF_BIN_OP(()); 126 }; 127 128 129 /* TruthClass */ 130 131 class TruthClass { 132 public: TruthClass()133 TruthClass() : value(false) {} TruthClass(bool value)134 TruthClass(bool value) : value(value) {} ~TruthClass()135 virtual ~TruthClass() {}; 136 operator bool() { return value; } 137 bool value; 138 }; 139