#include <initializer_list>
#include <iostream>
#include <vector>
template <typename L, typename Op, typename R>
class Expression
{
public:
Expression(L const& l, R const& r) : l_(l), r_(r) {}
typename L::value_type operator[](std::size_t i) const
{
return Op::Apply(l_[i], r_[i]);
}
private:
L const& l_;
R const& r_;
};
struct Plus
{
template <typename T>
static T Apply(T l, T r) { return l + r; }
};
template <class L, class R>
inline Expression<L, Plus, R> operator+(L const& lhs, R const& rhs)
{
return Expression<L, Plus, R>(lhs, rhs);
}
template <typename T>
struct Vector
{
using value_type = T;
std::vector<T> v_;
Vector(std::initializer_list<T> il)
: v_(il.begin(), il.end()) {}
template <typename E>
Vector& operator=(E const& r)
{
for (std::size_t i = 0; i < v_.size(); ++i) operator[](i) = r[i];
return *this;
}
T& operator[](std::size_t i) { return v_[i]; }
T const& operator[](std::size_t i) const { return v_[i]; }
};
int main()
{
Vector<int> l{ 1, 2, 3 };
Vector<int> r{ 4, 5, 6 };
Vector<int> v{ 0, 0, 0 };
v = l + r;
for(auto j : v.v_) std::cout << j << std::endl;
return 0;
}
I2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KCnRlbXBsYXRlIDx0eXBlbmFtZSBMLCB0eXBlbmFtZSBPcCwgdHlwZW5hbWUgUj4KY2xhc3MgRXhwcmVzc2lvbgp7CnB1YmxpYzoKCUV4cHJlc3Npb24oTCBjb25zdCYgbCwgUiBjb25zdCYgcikgOiBsXyhsKSwgcl8ocikge30KCgl0eXBlbmFtZSBMOjp2YWx1ZV90eXBlIG9wZXJhdG9yW10oc3RkOjpzaXplX3QgaSkgY29uc3QKCXsKCQlyZXR1cm4gT3A6OkFwcGx5KGxfW2ldLCByX1tpXSk7Cgl9Cgpwcml2YXRlOgoJTCBjb25zdCYgbF87CglSIGNvbnN0JiByXzsKfTsKCnN0cnVjdCBQbHVzCnsKCXRlbXBsYXRlIDx0eXBlbmFtZSBUPgoJc3RhdGljIFQgQXBwbHkoVCBsLCBUIHIpIHsgcmV0dXJuIGwgKyByOyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgTCwgY2xhc3MgUj4KaW5saW5lIEV4cHJlc3Npb248TCwgUGx1cywgUj4gb3BlcmF0b3IrKEwgY29uc3QmIGxocywgUiBjb25zdCYgcmhzKQp7CglyZXR1cm4gRXhwcmVzc2lvbjxMLCBQbHVzLCBSPihsaHMsIHJocyk7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgVmVjdG9yCnsKCXVzaW5nIHZhbHVlX3R5cGUgPSBUOwoKCXN0ZDo6dmVjdG9yPFQ+IHZfOwoKCVZlY3RvcihzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gaWwpCgkJOiB2XyhpbC5iZWdpbigpLCBpbC5lbmQoKSkge30KCgl0ZW1wbGF0ZSA8dHlwZW5hbWUgRT4KCVZlY3RvciYgb3BlcmF0b3I9KEUgY29uc3QmIHIpCgl7CgkJZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHZfLnNpemUoKTsgKytpKSBvcGVyYXRvcltdKGkpID0gcltpXTsKCQlyZXR1cm4gKnRoaXM7Cgl9CgoJVCYgb3BlcmF0b3JbXShzdGQ6OnNpemVfdCBpKSB7IHJldHVybiB2X1tpXTsgfQoKCVQgY29uc3QmIG9wZXJhdG9yW10oc3RkOjpzaXplX3QgaSkgY29uc3QgeyByZXR1cm4gdl9baV07IH0KfTsKCmludCBtYWluKCkKewoJVmVjdG9yPGludD4gbHsgMSwgMiwgMyB9OwoJVmVjdG9yPGludD4gcnsgNCwgNSwgNiB9OwoKCVZlY3RvcjxpbnQ+IHZ7IDAsIDAsIDAgfTsKCXYgPSBsICsgcjsKCglmb3IoYXV0byBqIDogdi52Xykgc3RkOjpjb3V0IDw8IGogPDwgc3RkOjplbmRsOwoKCXJldHVybiAwOwp9