Размер std::array
является константой времени компиляции, поэтому я не вижу, как библиотека может сгенерировать ее для вас, используя аргумент времени выполнения.
Вот довольно тривиальная реализация, которую, я думаю, делаетчто вам нужно:
#include <random>
#include <array>
#include <utility>
#include <iostream>
auto random_num() -> int {
static std::mt19937 engine{std::random_device{}()};
static std::uniform_int_distribution<int> dist(1, 10);
return dist(engine);
}
template<class F, std::size_t...Is>
auto generate_array_impl(F&& f, std::index_sequence<Is...>) -> std::array<decltype(f()), sizeof...(Is)>
{
return std::array<decltype(f()), sizeof...(Is)>
{{
(void(Is), f())...
}};
}
template<std::size_t N, class F>
auto generate_array(F f) -> std::array<decltype(f()), N>
{
return generate_array_impl(f, std::make_index_sequence<N>());
}
int main()
{
auto arr = generate_array<10>(random_num);
for (auto x : arr)
std::cout << x << '\n';
}
https://coliru.stacked -crooked.com / a / 983064b89c4dd355
Или добавление некоторой магии constexpr ...
#include <random>
#include <array>
#include <utility>
#include <iostream>
#include <boost/range.hpp>
template<std::size_t N>
constexpr auto c_size_t = std::integral_constant<std::size_t, N>();
auto random_num() -> int {
static std::mt19937 engine{std::random_device{}()};
static std::uniform_int_distribution<int> dist(1, 10);
return dist(engine);
}
template<class F, std::size_t...Is>
constexpr auto generate_array_impl(F&& f, std::index_sequence<Is...>) -> std::array<decltype(f()), sizeof...(Is)>
{
return std::array<decltype(f()), sizeof...(Is)>
{{
(void(Is), f())...
}};
}
template<std::size_t N, class F>
constexpr auto generate_array(F&& f, std::integral_constant<std::size_t, N>) -> std::array<decltype(f()), N>
{
return generate_array_impl(f, std::make_index_sequence<N>());
}
int main()
{
auto arr = generate_array(random_num, c_size_t<10>);
for (auto x : arr)
std::cout << x << ',';
std::cout << '\n';
constexpr auto arr2 = generate_array([i = std::size_t(0)]() mutable { return i++; }, c_size_t<10>);
for (auto x : arr2)
std::cout << x << ',';
std::cout << '\n';
}
https://coliru.stacked -crooked.com / а / 42c9c011026779eb