C++ Нужен необычный контейнер

Задача

Нужно реализовать контейнер с минимальным набором функций (begin, end, []), который вместо того, чтобы хранить информацию, вычисляет ее через специально заданную функцию. Но я не могу придумать, как передать туда вспомогательную информацию.

Например

template <class Ty>
struct sum{
  constexpr decltype(auto) operator()(Ty n) const {
    return n + mul; // Сюда нужно передать ту информацию
  }
};

template <size_t Num, Func>
struct container(){
  decltype(auto) begin() {
    return Func(0);
  }

  size_t n = Num;
}

int main(){
  size_t mul = 666; // Эту информацию нужно передать внутрь

  container<1'000'000'000'000'000'000, sum<int>> my_cont;
  // Пробовал передавать, как аргумент container<1'000'000'000'000'000'000, sum<int>(mul)> my_cont;
  // Так не получается, как аргумент шаблона передать тоже не получается      

  for(size_t i = 0; i < 100; ++i){
    auto tmp = my_cont[i];
  }
}

Ответы (1 шт):

Автор решения: Chorkov

Воспользуйтесь boost::range (можно стандартными ranges, если c++20):

template< typename Functor>
auto make_virtual_range( size_t size, Functor functor )
{
    return boost::irange((size_t)0, size) | boost::adaptors::transformed(functor);
}


int main()
{
    double mul=1000.; //< информация, которую собираемся передать, известна только в run-time 
                       // поэтому невозможно запихнуть ее в тип. Придется создавать экземпляр  нужного типа (и предавать в конструктор класса контейнера.   
                       // Но можно использовать замыкания.
    auto sun = [mul](size_t i){ return i + mul; };

    auto container = make_virtual_range(10000000000000000, sun);
    
    for( double v : container )
    {
        std::cout << v << std::endl;
        if(v>1010)
            break;
    }
    
    std::cout << container[10] << std::endl;
    

    return 0;
}
→ Ссылка