Принятый ответ хорош, но если вы не хотите загрязнять свой стек вызовов, лучше выполнить всю возможную обработку, прежде чем перейти к фактическим вещам во время выполнения.
В данном примере используется hana::cartesian_product
, что, вероятно, излишне для специальных случаев использования, но вы можете использовать вложенные hana::unpack
s для получения того же эффекта.
Вот рабочий пример:
https://godbolt.org/z/zKwpqe
#include <array>
#include <boost/hana/assert.hpp>
#include <boost/hana/at.hpp>
#include <boost/hana/cartesian_product.hpp>
#include <boost/hana/equal.hpp>
#include <boost/hana/for_each.hpp>
#include <boost/hana/range.hpp>
#include <boost/hana/transform.hpp>
#include <boost/hana/tuple.hpp>
#include <boost/hana/type.hpp>
namespace hana = boost::hana;
template <typename Real, int N>
constexpr std::array<Real, N> get_array() {
return {};
}
int main() {
auto types = hana::tuple_t<float, double, long, double>;
auto lengths = hana::to_tuple(hana::range_c<int, 0, 4>);
auto tls = hana::cartesian_product(hana::make_tuple(types, lengths));
auto get_array_fns = hana::transform(tls, [](auto pair) {
return [] {
return get_array<typename decltype(+hana::at_c<0>(pair))::type,
decltype(+hana::at_c<1>(pair))::value>();
};
});
hana::for_each(get_array_fns, [](auto get_array) {
auto arr = get_array();
// test arr
});
auto result_types = hana::unpack(get_array_fns, [](auto ...get_array) {
return hana::tuple_t<decltype(get_array())...>;
});
BOOST_HANA_CONSTANT_CHECK(hana::equal(
decltype(result_types){},
hana::tuple_t<std::array<float, 0>,
std::array<float, 1>,
std::array<float, 2>,
std::array<float, 3>,
std::array<double, 0>,
std::array<double, 1>,
std::array<double, 2>,
std::array<double, 3>,
std::array<long, 0>,
std::array<long, 1>,
std::array<long, 2>,
std::array<long, 3>,
std::array<double, 0>,
std::array<double, 1>,
std::array<double, 2>,
std::array<double, 3>>));
}