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;
}