【问题标题】:How to unroll a for loop using template metaprogramming如何使用模板元编程展开 for 循环
【发布时间】:2017-10-22 06:04:11
【问题描述】:

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

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

【问题讨论】:

  • 如果你不相信你的编译器能做最好的展开,也许找一个更好的编译器。
  • 重申 n.m 的答案,不要浪费时间假装自己是编译器。你的编译器知道如何最好地优化你的循环——包括展开东西。省去修复分析时发现的瓶颈的工作量。
  • 您可能会发现这很有用:informit.com/articles/article.aspx?p=30667&seqNum=7

标签: c++ for-loop template-meta-programming


【解决方案1】:

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

如果您真的想强制展开,请考虑 std::make_integer_sequence 和 C++17 的 fold expressions

#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;
  });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-08
    • 2016-12-03
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多