Is it possible to create an input, which is than repeated N times as a parameter for the function?
An example:
#include <range/v3/view/indices.hpp>
#include <range/v3/view/cartesian_product.hpp>
template<std::size_t length, std::size_t N>
constexpr auto tensor_cartesian_product(){
    const auto cart_input1 = ranges::view::indices(length); //create input
    return ranges::view::cartesian_product(cart_input1, cart_input1, ... /* N times cart_input1 */);
}
                You can use pack expansion:
template<std::size_t length, std::size_t... is>
constexpr auto tensor_cartesian_product(std::index_sequence<is...>) {
    const auto cart_input = ranges::view::indices(length);
    return ranges::view::cartesian_product((is, cart_input)...);
}
template<std::size_t length, std::size_t N>
constexpr auto tensor_cartesian_product() {
    return tensor_cartesian_product<length>(std::make_index_sequence<N>{});
}
The trick here is to harness the comma operator:
The comma operator expressions have the form:
E1 , E2.In a comma expression
E1, E2, the expressionE1is evaluated, its result is discarded ... . The type, value, and value category of the result of the comma expression are exactly the type, value, and value category of the second operand,E2. ...
The pack (is, cart_input)... will be expanded into (0, cart_input), (1, cart_input), ..., (N - 1, cart_input), and the result of evaluation of each of N terms will be cart_input.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With