如何使用模板元编程展开 for 循环

Pan*_*mar 5 c++ for-loop template-meta-programming

如何编写简单的 C++ 代码来简单地运行具有特定展开因子的 for 循环?例如,我需要编写一个 for 循环,将 i 值分配给数组的每个索引,即 A[i]=i 表示数组大小为 1e6。

现在我想添加一个展开因子,假设为 20。我不想手动编写 20 行代码并迭代 5k 次。我该怎么做呢?我是否嵌套了 for 循环?如果我使用模板元编程,编译器会自动为我执行一些展开操作吗?如何手动设置展开因子(当然在编译时固定)?

Jul*_*ius 7

以下示例是用C++17编写的,但通过一些更详细的技术,该想法适用于 C++11 及更高版本。

如果您确实想强制展开一些内容,请考虑std::make_integer_sequenceC++17 的折叠表达式

#include <iostream>
#include <type_traits>
#include <utility>

namespace detail {

template<class T, T... inds, class F>
constexpr void loop(std::integer_sequence<T, inds...>, F&& f) {
  (f(std::integral_constant<T, inds>{}), ...);// C++17 fold expression
}

}// detail

template<class T, T count, class F>
constexpr void loop(F&& f) {
  detail::loop(std::make_integer_sequence<T, count>{}, std::forward<F>(f));
}

int main() {
  loop<int, 5>([] (auto i) {
    constexpr int it_is_even_constexpr = i;
    std::cout << it_is_even_constexpr << std::endl;
  });
}
Run Code Online (Sandbox Code Playgroud)