Обычно это выполняется с помощью пары шаблонов:
namespace detail {
template<std::size_t... Idx>
auto make_mytype_array(std::index_sequence<Idx...>) {
return std::array<mytype, sizeof...(Idx)>{{
mytype(10 * Idx)...
}};
}
}
template<std::size_t N>
auto make_mytype_array() {
return detail::make_mytype_array(make_index_sequence<N>{});
}
Выше приведена пара бесполезных функций, но при необходимости ее можно сложить в класс.Если вам нужно больше, чем просто выражение типа 10*i
, тогда лямбда-выражение может быть передано в качестве другого аргумента (обычно это «вызываемый»).С копией elision это все свернется в прямую инициализацию объекта массива результата.