Conditional based on variable type?

Appreciate the views/advice so far!

So now we have:

size_t length(const char* cp) {
  return strlen(cp);
}

size_t length(String &s) {
  return s.length();
}

size_t length(const __FlashStringHelper *ifsh) {
  return strlen_P(reinterpret_cast<PGM_P>(ifsh));
}

size_t length(const int& i) {
  char buffer[17];
  return sprintf(buffer, "%d", i);
}

size_t length(const float& f, uint8_t dec = 2) {
  char buffer[17] = {'\n'};
  return strlen(dtostrf(f, 0, dec, buffer));
}

size_t length(const double& d, uint8_t dec = 2) {
  char buffer[17] = {'\n'};
  return strlen(dtostrf(d, 0, dec, buffer));
}

void setup() {
  Serial.begin(115600);

  // String x = "TEN CHARS!";
  // char* x = "TEN CHARS!";
  // char x[] = "TEN CHARS!";

  // Serial.println(length("TEN CHARS!"));
  // Serial.println(length(F("TEN CHARS!")));

  // int x = 22222;
  // int x = -22222;

  Serial.println(length(x));


  // float x = 49.8765432;
  // double x = 49.8765432;
  // Defaults to 2 decimal places unless specified such as below
  // Serial.println(length(x, 5));
}

void loop() { }


How's that looking?