是否可以创建一个输入,作为函数的参数重复 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 */);
}
最佳答案
您可以使用 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 :
The comma operator expressions have the form:
E1 , E2
.In a comma expression
E1, E2
, the expressionE1
is 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
. ...
包装
(is, cart_input)...
将扩展为 (0, cart_input), (1, cart_input), ..., (N - 1, cart_input)
,以及N
中每一个的评估结果条款将是 cart_input
.
关于C++,多次重复一个函数的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59266935/