12.6.3. Ejemplo de conversión de tipos

Un ejemplo en el que la conversión automática de tipos es extremadamente útil es con cualquier clase que encapsule una cadena de caracteres (en este caso, simplemente implementaremos la clase usando la clase estándar de C++ string dado que es simple). Sin la conversión automática de tipos, si quiere usar todas las funciones existentes de string de la librería estándar de C, tiene que crear un método para cada una, así:

//: C12:Strings1.cpp
// No auto type conversion
#include "../require.h"
#include <cstring>
#include <cstdlib>
#include <string>
using namespace std;

class Stringc {
  string s;
public:
  Stringc(const string& str = "") : s(str) {}
  int strcmp(const Stringc& S) const {
    return ::strcmp(s.c_str(), S.s.c_str());
  }
  // ... etc., for every function in string.h
};

int main() {
  Stringc s1("hello"), s2("there");
  s1.strcmp(s2);
} ///:~

Listado 12.22. C12/Strings1.cpp


Aquí, sólo se crea la función strcmp(), pero tendría que crear las funciones correspondientes para cada una de <cstring> que necesite. Afortunadamente, puede proporcionar una conversión automática de tipos permitiendo el acceso a todas las funciones de <cstring>.

//: C12:Strings2.cpp
// With auto type conversion
#include "../require.h"
#include <cstring>
#include <cstdlib>
#include <string>
using namespace std;

class Stringc {
  string s;
public:
  Stringc(const string& str = "") : s(str) {}
  operator const char*() const { 
    return s.c_str(); 
  }
};

int main() {
  Stringc s1("hello"), s2("there");
  strcmp(s1, s2); // Standard C function
  strspn(s1, s2); // Any string function!
} ///:~

Listado 12.23. C12/Strings2.cpp


Ahora cualquier función que acepte un argumento char* puede aceptar también un argumento Stringc porque el compilador sabe cómo crear un char* a partir de Stringc.