Es posible hacer ese trabajo, pero no a través de la sobrecarga static_cast<>()
. Lo hace por la sobrecarga del operador encasillado:
class Square
{
public:
Square(int side) : side(side) {}
operator int() const { return side * side; } // overloaded typecast operator
private:
int side;
};
// ...
// Compiler calls Square::operator int() to convert aSquare into an int
cout << static_cast<int>(aSquare) <<endl;
Tenga en cuenta que los operadores sobrecargados Typecast más a menudo que no tiende a hacer más daño que bien. Hacen posibles muchas operaciones de lanzamiento implícitas sin sentido. Cuando lees este fragmento de código a continuación, ¿crees que "a va a obtener el área de s"?
Square aSquare;
int a = aSquare; // What the heck does this do?
I certainly do not. Esto hace mucho más sentido y es mucho más legible:
Square aSquare;
int a = aSquare.GetArea();
no hablar de que normalmente se desean poder acceder a otra información sobre Square
, como GetSide()
o GetApothem()
o GetPerimeter()
o lo que sea. operator int()
obviamente puede devolver solo un int
, y no puede tener múltiples operator int()
s como miembros de una clase.
Aquí hay otra situación en la que hace operator int()
código que compila sin embargo, no tiene ningún sentido:
Square s;
if(s > 42) {} // Huh?!
¿Qué significa para un Square
a ser mayor que 42? No tiene sentido, pero con el operator int()
el código anterior se compilará como Shape
ahora es convertible a int
que se puede comparar con otro int
con un valor 4
.
Así que no escriba a los operadores de tipografía de esa manera. De hecho, si está sobrecargando los operadores de tipografía, es posible que desee pensar dos veces acerca de lo que está haciendo. En realidad, solo hay unos pocos casos en los que la sobrecarga del operador de conversión es útil en C++ moderno (por ejemplo, the safe bool idiom).
+1: una clase Square podría usar varios métodos más, p. 'int GetSideLength() const',' int GetPerimeter() const', y es para desambiguación que se debe usar un método con nombre para 'GetArea()'. – rwong
Gracias por la elaborada respuesta. – Radix
@In silico: con C++ 11 la expresión bool segura ya no es necesaria, ya que C++ 11 admite la palabra clave 'explicit' para los operadores de conversión. – smerlin