#include <utility>
struct my_complex
{
float r, i;
my_complex(float r, float i)
: r(r), i(i)
{}
template <typename Expr>
my_complex(Expr expr)
{
auto result = expr();
r = result.r;
i = result.i;
}
};
struct addition
{
my_complex const& lhs;
my_complex const& rhs;
addition(my_complex const& lhs, my_complex const& rhs)
: lhs(lhs), rhs(rhs)
{}
my_complex operator () ()
{
return my_complex(lhs.r + rhs.r, lhs.i + rhs.i);
}
};
addition operator + (my_complex const& lhs, my_complex const& rhs)
{
return addition(lhs, rhs);
}
int main()
{
my_complex a(42.f, 666.f);
my_complex b(3.14f, 2.7f);
auto c = a + b;
std::swap(a, c);
}
I2luY2x1ZGUgPHV0aWxpdHk+CiAKc3RydWN0IG15X2NvbXBsZXgKewogICAgICAgIGZsb2F0IHIsIGk7CiAKICAgICAgICBteV9jb21wbGV4KGZsb2F0IHIsIGZsb2F0IGkpCiAgICAgICAgICAgICAgICA6IHIociksIGkoaSkKICAgICAgICB7fQogCiAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEV4cHI+CiAgICAgICAgbXlfY29tcGxleChFeHByIGV4cHIpCiAgICAgICAgewogICAgICAgICAgICAgICAgYXV0byByZXN1bHQgPSBleHByKCk7CiAgICAgICAgICAgICAgICByID0gcmVzdWx0LnI7CiAgICAgICAgICAgICAgICBpID0gcmVzdWx0Lmk7CiAgICAgICAgfQp9OwogCnN0cnVjdCBhZGRpdGlvbgp7CiAgICAgICAgbXlfY29tcGxleCBjb25zdCYgbGhzOwogICAgICAgIG15X2NvbXBsZXggY29uc3QmIHJoczsKIAogICAgICAgIGFkZGl0aW9uKG15X2NvbXBsZXggY29uc3QmIGxocywgbXlfY29tcGxleCBjb25zdCYgcmhzKQogICAgICAgICAgICAgICAgOiBsaHMobGhzKSwgcmhzKHJocykKICAgICAgICB7fQogCiAgICAgICAgbXlfY29tcGxleCBvcGVyYXRvciAoKSAoKQogICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBteV9jb21wbGV4KGxocy5yICsgcmhzLnIsIGxocy5pICsgcmhzLmkpOwogICAgICAgIH0KfTsKIAphZGRpdGlvbiBvcGVyYXRvciArIChteV9jb21wbGV4IGNvbnN0JiBsaHMsIG15X2NvbXBsZXggY29uc3QmIHJocykKewogICAgICAgIHJldHVybiBhZGRpdGlvbihsaHMsIHJocyk7Cn0KIAppbnQgbWFpbigpCnsKICAgICAgICBteV9jb21wbGV4IGEoNDIuZiwgNjY2LmYpOwogICAgICAgIG15X2NvbXBsZXggYigzLjE0ZiwgMi43Zik7CiAKICAgICAgICBhdXRvIGMgPSBhICsgYjsKIAogICAgICAgIHN0ZDo6c3dhcChhLCBjKTsKfQ==