Базовый синтаксис перегрузки операторов в C ++

Мне сложно сформулировать вопрос о том, что я пытаюсь задать, поэтому позвольте мне привести вам пример:

Допустим, мы работаем над трехмерной системой, в которой мы определили векторный класс 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

Есть предложения?

Спасибо!

7
задан mushroombob 6 February 2012 в 17:35
поделиться