#include <iostream>
#include <initializer_list>
#include <array>
template <class T>
struct EIV_t {
size_t i;
T v;
};
class EI_t {
public:
EI_t(size_t i) : i(i) {}
template <class T>
EIV_t<T> operator = (const T& v) const
{
return EIV_t<T> { i, v };
}
private:
size_t i;
};
class E_t {
public:
EI_t operator [] (size_t i) const { return EI_t(i); }
};
extern E_t E;
template <class T, size_t N>
class CArray : private std::array<T,N> {
typedef std::array<T,N> Base;
public:
CArray() : Base() {}
CArray(std::initializer_list<T> l) : Base(l) {}
CArray(std::initializer_list<EIV_t<T>> l) : Base() {
for (auto i = l.begin(); i != l.end(); ++i) {
(*this)[i->i] = i->v;
}
}
// well, private inheritance has its cost
using Base::operator [];
using Base::begin;
using Base::end;
using Base::cbegin;
using Base::cend;
using Base::iterator;
using Base::const_iterator;
// a lot of missing...
};
E_t E;
int main() {
CArray<int, 7> a { E[1] = 13, E[6] = 14 };
for (auto i = a.begin(); i != a.end(); ++i) {
std::cout << *i << std::endl;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KI2luY2x1ZGUgPGFycmF5PgoKdGVtcGxhdGUgPGNsYXNzIFQ+CnN0cnVjdCBFSVZfdCB7CiAgc2l6ZV90IGk7CiAgVCAgICAgIHY7Cn07CgpjbGFzcyBFSV90IHsKcHVibGljOgogIEVJX3Qoc2l6ZV90IGkpIDogaShpKSB7fQogIHRlbXBsYXRlIDxjbGFzcyBUPgogIEVJVl90PFQ+IG9wZXJhdG9yID0gKGNvbnN0IFQmIHYpIGNvbnN0CiAgewogICAgIHJldHVybiBFSVZfdDxUPiB7IGksIHYgfTsKICB9CnByaXZhdGU6CiAgc2l6ZV90IGk7Cn07IApjbGFzcyBFX3QgewpwdWJsaWM6CiAgRUlfdCBvcGVyYXRvciBbXSAoc2l6ZV90IGkpIGNvbnN0IHsgcmV0dXJuIEVJX3QoaSk7IH0KfTsgCgpleHRlcm4gRV90IEU7Cgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgc2l6ZV90IE4+CmNsYXNzIENBcnJheSA6IHByaXZhdGUgc3RkOjphcnJheTxULE4+IHsKICB0eXBlZGVmIHN0ZDo6YXJyYXk8VCxOPiBCYXNlOwpwdWJsaWM6CiAgQ0FycmF5KCkgOiBCYXNlKCkge30KICBDQXJyYXkoc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IGwpIDogQmFzZShsKSB7fQogIENBcnJheShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8RUlWX3Q8VD4+IGwpIDogQmFzZSgpIHsKICAgICBmb3IgKGF1dG8gaSA9IGwuYmVnaW4oKTsgaSAhPSBsLmVuZCgpOyArK2kpIHsKICAgICAgICAgKCp0aGlzKVtpLT5pXSA9IGktPnY7CiAgICAgfQogIH0KCgogIC8vIHdlbGwsIHByaXZhdGUgaW5oZXJpdGFuY2UgaGFzIGl0cyBjb3N0CiAgdXNpbmcgQmFzZTo6b3BlcmF0b3IgW107CiAgdXNpbmcgQmFzZTo6YmVnaW47CiAgdXNpbmcgQmFzZTo6ZW5kOwogIHVzaW5nIEJhc2U6OmNiZWdpbjsKICB1c2luZyBCYXNlOjpjZW5kOwogIHVzaW5nIEJhc2U6Oml0ZXJhdG9yOwogIHVzaW5nIEJhc2U6OmNvbnN0X2l0ZXJhdG9yOwogIC8vIGEgbG90IG9mIG1pc3NpbmcuLi4KfTsKCkVfdCBFOwoKaW50IG1haW4oKSB7CiAgIENBcnJheTxpbnQsIDc+IGEgeyBFWzFdID0gMTMsIEVbNl0gPSAxNCB9OwogICBmb3IgKGF1dG8gaSA9IGEuYmVnaW4oKTsgaSAhPSBhLmVuZCgpOyArK2kpIHsKICAgICAgc3RkOjpjb3V0IDw8ICppIDw8IHN0ZDo6ZW5kbDsKICAgfSAKfQo=