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
.