【问题标题】:How to get constexpr from iterating variable?如何从迭代变量中获取 constexpr?
【发布时间】:2020-07-27 21:26:51
【问题描述】:

我正在尝试使用 for 循环,该循环使函数调用需要常量表达式:

for(int x = 0; x < 10; x++){
    func(variable_that_is_constexpr)
} 

如何将x 变成常量表达式?

以下不起作用,因为它报告了错误:

constexpr int toConstExpr(int x){
    return x;
}
constexpr y = toConstExpr(z);

'z' 的值不能用于常量表达式

编辑:

我正在尝试执行上述操作,以便可以循环遍历函数的常量表达式,如下所示

constexpr int pins[2] = {1, 2};
for(int x = 0; x < 2; x++){
    func(pins[x]);
}

'x' 的值在常量表达式中不可用

编辑二:

给出我正在尝试做的确切示例。我在数组中有引脚号。我想使用这些引脚号声明 LEDStrips。声明 LED 灯条的函数要求引脚为常量表达式。我想做以下事情:

constexpr int pins[] = {1, 2};
for (int x = 0; x < 2; x++}{
      FastLED.addLeds<WS2811, pins[x], GRB>(leds[x], 5).setCorrection( TypicalLEDStrip );
}

'x' 的值在常量表达式中不可用

编辑三个

有没有一种不需要多次重复同一行来执行此操作的漂亮方法,其中我要更改的数字必须是一个常数?

FastLED.addLeds<WS2811, 3, GRB>(leds[0], 5).setCorrection( TypicalLEDStrip );
FastLED.addLeds<WS2811, 4, GRB>(leds[1], 5).setCorrection( TypicalLEDStrip );
FastLED.addLeds<WS2811, 5, GRB>(leds[2], 5).setCorrection( TypicalLEDStrip );

【问题讨论】:

  • 您的问题不清楚。例如。您想以仅明确用于常量表达式的方式从循环中使用计数器变量的事实。我的印象是“我想用一只不会飞的鸟,例如企鹅,作为飞行的邮递员。”总的来说,我认为我们正在寻找meta.stackexchange.com/questions/66377/what-is-the-xy-problem,所以请退后一步,解释一下你真正想要以这种方式实现的目标。
  • @Yunnosch 我有一个常量数组。我正在尝试将每个插入一个函数。我不能使用简单的 for 循环,因为在 for 循环中迭代的变量不是常量表达式。我想我的问题更准确地描述为如何使用常量表达式索引遍历常量表达式,因此整个表达式是一个常量表达式。
  • 请通过editing 解释您的问题。

标签: c++ arduino constexpr


【解决方案1】:

这可以通过 std::integer_sequence 来完成,它是一个可以在编译时遍历的整数序列。

#include <utility>

consteval void func(int i) {}

template<typename T, T... ints>
void call_func(std::integer_sequence<T, ints...> int_seq)
{
    (func(ints),...);
}

int main()
{
    constexpr auto is = std::make_index_sequence<10>();
    call_func(is);
}

例子改编自here

【讨论】:

  • 如果对 OP 来说不是很明显,他们需要将 func(ints) 替换为 FastLED.addLeds&lt;WS2811, pins[ints], GRB&gt;(leds[ints], 5).setCorrection(TypicalLEDStrip)
  • 如何在 Arduino 上包含实用程序?我得到了fatal error: utility: No such file or directory
  • @Cammy_the_block 你没有。 Arduino 编译器已瘫痪。它不是真正的 C++ 编译器。您将学习如何编写自己的integer_sequence(不难,但不能保证它可以与 Arduino 编译器一起使用),从其他地方复制一个实现(例如 libstdc++,但同样不能保证它可以与 Arduino 编译器一起使用),尝试调整一个Arduino 的 C++ 标准库端口(有几个),或者只需手动编写 10 个对 func() 的调用,这似乎是迄今为止最简单的选择。
猜你喜欢
  • 1970-01-01
  • 2018-03-06
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
  • 2014-05-20
  • 1970-01-01
  • 2021-12-13
相关资源
最近更新 更多