Мне сложно сформулировать вопрос о том, что я пытаюсь задать, поэтому позвольте мне привести вам пример:
Допустим, мы работаем над трехмерной системой, в которой мы определили векторный класс 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
Есть предложения?
Спасибо!