C++,多次重复一个函数的输入

M.M*_*Mac 5 c++ templates

是否可以创建一个输入,作为函数的参数重复 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)

Evg*_*Evg 9

您可以使用包扩展

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

  • @M.Mac,这个想法是将“N”扩展为“0, 1, ... N-1”。规范的方法是使用 `std::make_index_sequence&lt;N&gt;{}` 和一个辅助函数,该函数采用 `std::index_sequence&lt;is...&gt;` 和一组索引 `is...`。 (2认同)