Мне трудно сформулировать вопрос о том, что я пытаюсь задать, поэтому приведу пример:
Скажем, мы работаем над 3d-системой, в которой мы определили векторный класс, Vec3. Мы перегружаем некоторые арифметические операторы для очевидных резонов. Среди них мы перегружаем оператор *, чтобы он возвращал скалярное произведение двух векторов. Теперь наш код должен выглядеть примерно так:
class Vec3{
private:
float x, y, z;
public:
float operator*(const Vec3&) const; //dot product
.
.
.
Теперь скажите, что мы хотим иметь возможность масштабировать наш вектор, используя оператор * с чем-то, скажем, с плавающей точкой. Это можно сделать, объявив следующее:
Vec3 operator*(const float) const;
friend Vec3 operator*(const float, const Vec3&);
Это приводит к двум перегрузкам и Мне интересно, есть ли способ сделать это только с одной , то есть, скажем, мы объявляем это вместо двух вышеуказанных строк:
friend Vec3 operator*(const Vec3&, const Vec3&);
, а затем добавьте значения по умолчанию для Vec3 ctor для обработки преобразования из числа с плавающей запятой.
Этот последний пример будет работать для:
Vec3 someVec3 = 1.0 * otherVec3; //through friend Vec3 operator*(const float, const Vec3&)
однако не для этого:
Vec3 someVec3 = otherVec3 * 1.0;
поскольку компилятор не будет знать, какой из двух использовать:
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
Есть предложения?
Спасибо!