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() {}