fork download
  1. #include <iostream>
  2. #include <initializer_list>
  3. #include <array>
  4.  
  5. template <class T>
  6. struct EIV_t {
  7. size_t i;
  8. T v;
  9. };
  10.  
  11. class EI_t {
  12. public:
  13. EI_t(size_t i) : i(i) {}
  14. template <class T>
  15. EIV_t<T> operator = (const T& v) const
  16. {
  17. return EIV_t<T> { i, v };
  18. }
  19. private:
  20. size_t i;
  21. };
  22. class E_t {
  23. public:
  24. EI_t operator [] (size_t i) const { return EI_t(i); }
  25. };
  26.  
  27. extern E_t E;
  28.  
  29. template <class T, size_t N>
  30. class CArray : private std::array<T,N> {
  31. typedef std::array<T,N> Base;
  32. public:
  33. CArray() : Base() {}
  34. CArray(std::initializer_list<T> l) : Base(l) {}
  35. CArray(std::initializer_list<EIV_t<T>> l) : Base() {
  36. for (auto i = l.begin(); i != l.end(); ++i) {
  37. (*this)[i->i] = i->v;
  38. }
  39. }
  40.  
  41.  
  42. // well, private inheritance has its cost
  43. using Base::operator [];
  44. using Base::begin;
  45. using Base::end;
  46. using Base::cbegin;
  47. using Base::cend;
  48. using Base::iterator;
  49. using Base::const_iterator;
  50. // a lot of missing...
  51. };
  52.  
  53. E_t E;
  54.  
  55. int main() {
  56. CArray<int, 7> a { E[1] = 13, E[6] = 14 };
  57. for (auto i = a.begin(); i != a.end(); ++i) {
  58. std::cout << *i << std::endl;
  59. }
  60. }
  61.  
Success #stdin #stdout 0s 2884KB
stdin
Standard input is empty
stdout
0
13
0
0
0
0
14