Estoy teniendo dificultades para la formación de una cuestión de lo que estoy tratando de preguntar por lo que te voy a dar un ejemplo:operador básico de la sobrecarga de sintaxis en C++
decir que estamos trabajando en un sistema en el que tenemos 3d definió una clase vectorial, Vec3. Sobrecargamos algunos operadores aritméticos para resons obvios. Entre estos, sobrecargamos el operador * para que devuelva el producto escalar de dos vectores. Ahora nuestro código debe ser algo como esto:
class Vec3{
private:
float x, y, z;
public:
float operator*(const Vec3&) const; //dot product
.
.
.
Ahora dicen que queremos ser capaces de escalar nuestro vector mediante el operador * con algo, por ejemplo un flotador. Esto podría hacerse al declarar lo siguiente:
Vec3 operator*(const float) const;
friend Vec3 operator*(const float, const Vec3&);
este yeilds dos sobrecargas y Me pregunto si hay una manera de hacerlo con una sola, es decir, decimos declaramos esto en vez de las dos líneas anteriores:
friend Vec3 operator*(const Vec3&, const Vec3&);
y luego añadir valores por defecto para el ctor vec3 para manejar la conversión de flotador.
Este último ejemplo podría funcionar para:
Vec3 someVec3 = 1.0 * otherVec3; //through friend Vec3 operator*(const float, const Vec3&)
sin embargo, no
para esto:
Vec3 someVec3 = otherVec3 * 1.0;
como el compilador no sabría cuál de los dos instrumentos debe utilizar:
friend Vec3 operator*(const float, const Vec3&); //the one we want to use
or
float operator*(const Vec3&) const; //the one for the dot product
¿Alguna sugerencia?
¡Gracias!
¿Qué pasa con dos sobrecargas? Como usted señala, se crea una ambigüedad bastante desagradable cuando se intenta simplificar en exceso ... –
Lo único que haría de manera diferente, es hacer que ambas versiones de las funciones de amigo escalar se multipliquen en lugar de ser un miembro, de modo que el código tener la misma simetría que la operación misma. –
Sería ineficiente construir un vector solo para pasar un flotador. Esto sería una ineficiencia de tiempo de ejecución, pero una función sobrecargada adicional podría estar integrada. – QuentinUK