Цепочка перегруженных операторов с разными типами параметров - PullRequest
0 голосов
/ 07 октября 2018

Допустим, у меня есть класс "Vector" (Math not Container), и я бы хотел перегрузить операторы, чтобы я мог выполнять цепочку вычислений.

Это прекрасно работает для меня:

friend Vector operator+(const Vector<N, Type>& a, const Vector<N, Type>& b)
friend Vector operator+(      Vector<N, Type>& a, const Vector<N, Type>& b)

и с этим я могу делать что-то вроде

auto a = vec<3>(.0f, .0f, .0f);
auto b = a + a + a;

Однако я также реализовал список инициализатора

Vector& operator=(Type const (&arr)[N])

, который позволяет мне написать что-то вроде этого:

a = { .1f, .1f, .1f };
a += { .1f, .1f, .1f };

Однако я не могу выполнить цепочку этих списков инициализаторов.

a = { .1f, .1f, .1f } + b;
a = { .1f, .1f, .1f } + { .1f, .1f, .1f };

Я уже пытался добавить перегрузки операторов, такие как

friend Vector operator+(const Vector<N, Type>& a, Type const (&arr)[N])     
friend Vector operator+(      Vector<N, Type>& a, Type const (&arr)[N])     
friend Vector operator+(Type const (&arr)[N], const Vector<N, Type>& a)     
friend Vector operator+(Type const (&arr)[N],       Vector<N, Type>& a)   

, но это не такt работа ...

Возможно ли это?

1 Ответ

0 голосов
/ 07 октября 2018

Нет, это невозможно (не при таком использовании).

Выражение { .1f, .1f, .1f } + { .1f, .1f, .1f }; не является Vector, и любая перегрузка, определенная вами для Vector, не может на нее повлиять.

Мое лучшее предложение - добавить нулевой член, который является вектором:

Vector zero_vec = { 0, 0, 0 }; a = zero_vec + { .1f, .1f, .1f } + { .1f, .1f, .1f };

Он основан на том факте, что operator+ является левоассоциативным.

...