是否可以创建一个输入,该输入作为函数的参数重复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 */);
}
答案 0 :(得分:8)
您可以使用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>{});
}
这里的诀窍是利用comma operator:
逗号运算符表达式的格式为:
E1 , E2
。在逗号表达式
E1, E2
中,对表达式E1
求值,其结果被丢弃...。逗号表达式的结果的类型,值和值类别恰好是第二个操作数E2
的类型,值和值类别。 ...
包(is, cart_input)...
将扩展为(0, cart_input), (1, cart_input), ..., (N - 1, cart_input)
,每个N
项的评估结果将为cart_input
。