namespace easy_random {
template<typename First_T>
auto make_tuple_of_rands(First_T first) {
return std::make_tuple(first());
}
template<typename First_T, typename... Rest_T>
auto make_tuple_of_rands(First_T first, Rest_T... rest) {
return std::tuple_cat(make_tuple_of_rands(first),make_tuple_of_rands(rest...));
}
template<typename First_T>
auto make_tuple_of_n_rands(std::size_t n, First_T first) {
return std::make_tuple(first(n));
}
template<typename First_T, typename... Rest_T>
auto make_tuple_of_n_rands(std::size_t n, First_T first, Rest_T... rest) {
return std::tuple_cat(make_tuple_of_n_rands(n, first), make_tuple_of_n_rands(n, rest...));
}
template<typename... RandStreamTypes>
class multi_rand_stream {
std::tuple<RandStreamTypes...> streams;
public:
explicit multi_rand_stream(RandStreamTypes... args);
explicit multi_rand_stream(std::tuple<RandStreamTypes...> &args);
auto operator()();
auto operator()(std::size_t n);
};
template<typename... RandStreamTypes>
multi_rand_stream<RandStreamTypes...>::multi_rand_stream(RandStreamTypes... args) : streams(args...) {}
template<typename... RandStreamTypes>
multi_rand_stream<RandStreamTypes...>::multi_rand_stream(std::tuple<RandStreamTypes...> &args) : streams(args) {}
template<typename... RandStreamTypes>
auto multi_rand_stream<RandStreamTypes...>::operator()() {
return std::apply(make_tuple_of_rands, streams);
}
template<typename... RandStreamTypes>
auto multi_rand_stream<RandStreamTypes...>::operator()(std::size_t n) {
return std::apply(make_tuple_of_n_rands, std::tuple_cat(std::make_tuple(n), streams));
}
}
I would like to be able to return a tuple composed of the return values from running the members of tup as functors.
I'm currently at a loss as to how to approach doing so. I have tried using apply and recursion with tuple_cat, but it has been having trouble deducing the template typing of the functions.
edit: to include the full class i'm trying to implement, maybe that will expose my error.