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

时间:2019-12-10 12:10:58

标签: 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 */);
}

1 个答案:

答案 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