Tienes operadores para convertir tipos. Su declaración es:
operator <tipo>();
operator int();
Aquí es importante ver la importancia de la palabra "explicit":
explicit operator int();
Con explicit, solo podrás hacer la conversión haciendo un cast manualmente (por ejemplo,
(int)a)
Un ejemplo de todo esto:
#include <iostream>
using namespace std;
class A {
public:
operator int(){
return 1;
}
explicit operator const char*(){
return "_1";
}
};
int main(){
A a;
int n = a;
const char* c = (const char*)a;
cout << a << c << endl;
}
De todos modos, cuidado con implementar estos operadores sin la palabra explicit. En caso de errores o confusiones, estos operadores pueden ocultar el error. Por ejemplo:
class A {
public:
operator int*(){
return nullptr;
}
};
int main(){
A a;
void* n = &a;
void* m = a; // Nos hemos olvidado el ampersand, y como la conversión de int* a void* es implícita también, no da problema.
}
Siempre que implementes estos operadores, suele ser buena idea proveer además un método "normal" de conversión, tipo "getCString()"