Pan*_*mar 5 c++ for-loop template-meta-programming
如何编写简单的 C++ 代码来简单地运行具有特定展开因子的 for 循环?例如,我需要编写一个 for 循环,将 i 值分配给数组的每个索引,即 A[i]=i 表示数组大小为 1e6。
现在我想添加一个展开因子,假设为 20。我不想手动编写 20 行代码并迭代 5k 次。我该怎么做呢?我是否嵌套了 for 循环?如果我使用模板元编程,编译器会自动为我执行一些展开操作吗?如何手动设置展开因子(当然在编译时固定)?
以下示例是用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)