【问题标题】:Constexpr loop with a no constexpr content没有 constexpr 内容的 constexpr 循环
【发布时间】:2017-08-13 08:30:33
【问题描述】:

我想使用 boost hana 来生成这个最终代码:

template < typename ... Ts >
void  foo(Ts ... data) {

  constexpr auto tuple = hana::make_tuple(data...);

  //Code that I need to be generate
  container_c[tuple[0_c]].foo2();
  container_c[tuple[1_c]].foo2();
  container_c[tuple[2_c]].foo2();
}

container_c 是在编译时生成的地图,不过我认为这并不重要。 foo2 不是 constexpr

我在考虑使用hana::size(tuple).times,但我需要一个增量,可能使用hana::make_range(hana::size_c&lt;0&gt;, hana::size(tuple)),但我不知道该怎么做。

我希望找到一个函数,它允许我在 hana 中的元组的每个成员上执行一个函数。类似于 hana::transform 但用于 void lambda。

我没想到用Hana 很难找到如何做到这一点,我应该像过去那样使用专业化吗?

顺便说一句,我现在使用的是 gcc 7.1,但你可以假设我没有编译器限制。

【问题讨论】:

  • hana::for_each
  • @JasonRice 我怎么无法在 hana 文档中找到它...感谢您的评论!但是问这个仍然是个好主意,因为我最终得到了一个更好的解决方案(我认为)。

标签: c++ metaprogramming boost-hana


【解决方案1】:

要遍历您的 data,您可以这样做

template < typename ... Ts >
void  foo(Ts ... data) {
    int dummy[] = {0, (container_c[data].foo2(), void(), 0)...};
    static_cast<void>(dummy); // Avoid warning for unused variable.
}

或在 C++17 中

template < typename ... Ts >
void  foo(Ts ... data) {
    (static_cast<void>(container_c[data].foo2()), ...);
}

【讨论】:

  • 请注意,如果 OP 的编译器支持 C++17 fold expressions,这会变得不那么难看。
  • 好像你想初始化一个数组来迭代?但我根本不明白这种语法。并且循环将在运行时完成然后不是吗?顺便说一句,我没有任何编译器限制,我会为此编辑我的问题。
  • @hvd:添加 C++17 版本。
  • 哦,我用 C++17 版本搞定了 :) 谢谢,我确实尝试过类似的方法,我应该了解有关折叠表达式的更多信息。
猜你喜欢
  • 2019-04-22
  • 2020-10-23
  • 1970-01-01
  • 2013-01-01
  • 2015-05-04
  • 2023-03-15
  • 2016-07-24
  • 2017-06-01
  • 2020-02-19
相关资源
最近更新 更多