#include <iostream>
#include <functional>

struct Data {
  size_t d_size;
  double *d_data;
  Data(size_t size) : d_size(size), d_data(new double[size]) {}
  ~Data() { delete[] d_data; }
  double &operator[](size_t i) { return d_data[i]; }
  
  
  inline void forEach(std::function<void(Data &, size_t)> f) {
    for (size_t index = 0; index != d_size; ++index)
      f(*this, index);
  }
};



int main() {
  Data im(50000000);
  im.forEach([](Data &im, size_t i) {
    im[i] = static_cast<double>(i);
  });
  
  double sum = 0;
  im.forEach([&sum](Data &im, size_t i) {
    sum += im[i];
  });
  
  std::cout << sum << '\n';
}