是否可以创建一个输入,作为函数的参数重复 N 次?
一个例子:
#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 */);
}
Run Code Online (Sandbox Code Playgroud)
您可以使用包扩展:
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>{});
}
Run Code Online (Sandbox Code Playgroud)
这里的技巧是利用逗号运算符:
逗号运算符表达式的形式为:
E1 , E2。在逗号表达式中
E1, E2,表达式E1被计算,其结果被丢弃......。逗号表达式结果的类型、值和值类别正是第二个操作数 的类型、值和值类别E2。...
将包(is, cart_input)...扩展为(0, cart_input), (1, cart_input), ..., (N - 1, cart_input),每个N术语的评估结果为cart_input。