Я закодировал ответ Фреда Нурка, используя clang + libc ++ .Мне пришлось отказаться от использования синтаксиса инициализатора, потому что Clang еще не реализовал это.Я также поместил оператор печати в конструктор копирования, чтобы мы могли считать копии.
#include <iostream>
template<class T>
struct AddPlus {
friend T operator+(T a, T const &b) {
a += b;
return a;
}
friend T&& operator+(T &&a, T const &b) {
a += b;
return std::move(a);
}
friend T&& operator+(T const &a, T &&b) {
b += a;
return std::move(b);
}
friend T&& operator+(T &&a, T &&b) {
a += b;
return std::move(a);
}
};
struct vec
: public AddPlus<vec>
{
int v[3];
vec() : v() {};
vec(int x, int y, int z)
{
v[0] = x;
v[1] = y;
v[2] = z;
};
vec(const vec& that)
{
std::cout << "Copying\n";
v[0] = that.v[0];
v[1] = that.v[1];
v[2] = that.v[2];
}
vec& operator=(const vec& that) = default;
~vec() = default;
vec& operator+=(const vec& that)
{
v[0] += that.v[0];
v[1] += that.v[1];
v[2] += that.v[2];
return *this;
}
};
int main()
{
vec v1(1, 2, 3), v2(1, 2, 3), v3(1, 2, 3), v4(1, 2, 3);
vec v5 = v1 + v2 + v3 + v4;
}
test.cpp:66:22: error: use of overloaded operator '+' is ambiguous (with operand types 'vec' and 'vec')
vec v5 = v1 + v2 + v3 + v4;
~~~~~~~ ^ ~~
test.cpp:5:12: note: candidate function
friend T operator+(T a, T const &b) {
^
test.cpp:10:14: note: candidate function
friend T&& operator+(T &&a, T const &b) {
^
1 error generated.
Я исправил эту ошибку следующим образом:
template<class T>
struct AddPlus {
friend T operator+(const T& a, T const &b) {
T x(a);
x += b;
return x;
}
friend T&& operator+(T &&a, T const &b) {
a += b;
return std::move(a);
}
friend T&& operator+(T const &a, T &&b) {
b += a;
return std::move(b);
}
friend T&& operator+(T &&a, T &&b) {
a += b;
return std::move(a);
}
};
Выполнение выходных данных примера:
Copying
Copying
Далее я попробовал подход на C ++ 03:
#include <iostream>
struct vec
{
int v[3];
vec() : v() {};
vec(int x, int y, int z)
{
v[0] = x;
v[1] = y;
v[2] = z;
};
vec(const vec& that)
{
std::cout << "Copying\n";
v[0] = that.v[0];
v[1] = that.v[1];
v[2] = that.v[2];
}
vec& operator=(const vec& that) = default;
~vec() = default;
vec& operator+=(const vec& that)
{
v[0] += that.v[0];
v[1] += that.v[1];
v[2] += that.v[2];
return *this;
}
};
vec operator+(const vec& lhs, const vec& rhs)
{
return vec(lhs.v[0] + rhs.v[0], lhs.v[1] + rhs.v[1], lhs.v[2] + rhs.v[2]);
}
int main()
{
vec v1(1, 2, 3), v2(1, 2, 3), v3(1, 2, 3), v4(1, 2, 3);
vec v5 = v1 + v2 + v3 + v4;
}
Запуск этой программы не дал результатов вообще.
Это результаты, которые я получил с лязг ++ .Интерпретировать их, как вы можете.И ваш пробег может варьироваться.