enum t_lastMod {UNKNOWN, ONEBYTE, TWOBYTES};
union t_data {
uint8_t oneByte;
uint16_t twoBytes;
};
struct t_returnedData {
t_data* data;
t_lastMod field;
};
class A {
private:
t_data dataArray[10];
t_returnedData activeData;
public:
A() {
activeData.field = UNKNOWN;
}
A& SetByteValue(uint8_t data) {
dataArray[0].oneByte = data;
activeData.field = ONEBYTE;
activeData.data = &(dataArray[0]);
return *this;
}
A& SetIntValue(uint16_t data) {
dataArray[0].twoBytes = data;
activeData.field = TWOBYTES;
activeData.data = &(dataArray[0]);
return *this;
}
t_returnedData& ReturnAnyValue() {
return activeData;
}
};
void printData(t_returnedData& r) {
switch (r.field) {
case UNKNOWN:
Serial.println(F("unknown data"));
break;
case ONEBYTE:
Serial.print(F("One byte of data => "));
Serial.println(r.data->oneByte);
break;
case TWOBYTES:
Serial.print(F("Two bytes of data => "));
Serial.println(r.data->twoBytes);
break;
}
};
A a;
void setup() {
Serial.begin(115200); Serial.println();
printData(a.ReturnAnyValue()); // unknown
printData(a.SetByteValue(10).ReturnAnyValue()); // 1 byte
printData(a.SetIntValue(1000).ReturnAnyValue()); // 2 bytes
}
void loop() {}