C++ 如何从迭代变量中获取constexpr?

C++ 如何从迭代变量中获取constexpr?,c++,arduino,constexpr,C++,Arduino,Constexpr,我正在尝试使用for循环,该循环进行需要常量表达式的函数调用: for(int x=0;x整数序列< /C>(不难,但不能保证它与ARDUINO编译器一起工作)。复制一个实现从其他地方(例如LIbSTDC++ +,但又不能保证它将与ARDUINO编译器),尝试适应一个C++标准库端口的ARDUINO(有几个),或只是写10个调用函数()的手,这似乎是最简单的选择至今。

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

for(int x=0;x<10;x++){
func(变量为constexpr的变量)
} 
如何将
x
转换为常量表达式

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

constexpr int-toConstExpr(int x){
返回x;
}
constexpr y=toConstExpr(z);
“z”的值在常量表达式中不可用

编辑:

我正试着做上面的工作,这样我就可以循环一个函数的常量表达式,如下所示

constexpr int pins[2] = {1, 2};
for(int x = 0; x < 2; x++){
    func(pins[x]);
}
constexpr int pins[2]={1,2};
对于(int x=0;x<2;x++){
func(pins[x]);
}
“x”的值在常量表达式中不可用

编辑两个:

给我一个确切的例子来说明我想做什么。我有一个数组中的pin码。我想使用这些pin码声明LED条。声明led条带的函数要求引脚为常量表达式。我想做以下工作:

constexpr int pins[] = {1, 2};
for (int x = 0; x < 2; x++}{
      FastLED.addLeds<WS2811, pins[x], GRB>(leds[x], 5).setCorrection( TypicalLEDStrip );
}
constexpr int pins[]={1,2};
对于(int x=0;x<2;x++}{
FastLED.AddLED(LED[x],5).设置校正(TypicCalledStrip);
}
“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 );

FastLED.addled(led[0],5).setCorrection(TypicalLEDStrip);
FastLED.AddLED(LED[1],5])设置校正(TypicCalledStrip);
FastLED.AddLED(LED[2],5])设置校正(TypicCalledStrip);

这可以通过std::integer\u序列完成,这是一个可以在编译时遍历的整数序列

#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);
}
#包括
consteval void func(int i){}
样板
void call_func(std::integer_sequence int_seq)
{
(func(ints),…);
}
int main()
{
constexpr auto is=std::make_index_sequence();
调用函数(is);
}

示例改编自std::integer_序列,这可以通过std::integer_序列完成,这是一个可以在编译时遍历的整数序列

#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);
}
#包括
consteval void func(int i){}
样板
void call_func(std::integer_sequence int_seq)
{
(func(ints),…);
}
int main()
{
constexpr auto is=std::make_index_sequence();
调用函数(is);
}

根据

改编的示例您的问题不清楚。例如,您希望以仅用于常量表达式的方式使用循环中的计数器变量。我得到的印象是“我想使用非飞行的鸟,例如企鹅,作为飞行邮件载体。”作为一个整体,我认为我们在看一个,所以请退一步,解释一下你用这种方法想要达到的目的。@Yunnosch我有一个常量数组。我正试图将每个常量插入一个函数中。但我不能使用简单的for循环,因为在for循环中迭代的变量不是常量表达式。我想我的任务是ion更准确地描述为如何使用常量表达式索引循环常量表达式,因此整个表达式是一个常量表达式。请通过取消您的问题进行解释。@Yunnosch您的问题不清楚。例如,您希望以显式用于常量表达式的方式使用循环中的计数器变量仅限ns。我的印象是“我想用一只不会飞的鸟,例如企鹅,作为飞行的邮递员。”作为一个整体,我认为我们在看一个,所以请退一步,解释一下你用这种方法想要达到的目的。@Yunnosch我有一个常量数组。我正试图将每个常量插入一个函数中。但我不能使用简单的for循环,因为在for循环中迭代的变量不是常量表达式。我想我的任务是ion更准确地描述为如何使用常量表达式索引循环常量表达式,使整个表达式成为常量表达式。请通过回答您的问题进行解释。@Yunnosch如果对OP来说不明显,他们需要将
func(ints)
替换为
fastld.addled(led[ints],5)。setCorrection(TypicalLEDStrip)。我如何在ARDUNO上包含实用程序?我得到了<代码>致命错误:实用程序:没有这样的文件或目录<代码> @ CAMYYTHYHYA块。ARDUINO编译器是残缺的。它不是真正的C++编译器。您可以学习如何编写自己的代码>整数序列< /C>(不难,但不能保证它与ARDUINO编译器一起工作)。从其他地方复制一个实现(例如LIbSTDC++),但又不能保证它将与ARDUINO编译器一起工作,尝试将其中一个C++标准库端口适应于ARDUINO(有几个),或者只需向函数(10)写入调用。手动,这似乎是迄今为止最简单的选择。如果OP不清楚,他们需要将
func(ints)
替换为
FastLED.addled(led[ints],5)。setCorrection(TypicalLEDStrip):如何在ARDUNO上包含实用程序?我得到了<代码>致命错误:实用程序:没有这样的文件或目录<代码> @ CAMYYTHEYA块。ARDUINO编译器是残缺的。它不是真正的C++编译器。您可以学习如何编写自己的代码>整数序列< /C>(不难,但不能保证它与ARDUINO编译器一起工作)。复制一个实现从其他地方(例如LIbSTDC++ +,但又不能保证它将与ARDUINO编译器),尝试适应一个C++标准库端口的ARDUINO(有几个),或只是写10个调用函数()的手,这似乎是最简单的选择至今。