gpt4 book ai didi

c++ - 有状态 C++ 全局 void 函数指针

转载 作者:行者123 更新时间:2023-11-30 03:35:32 25 4
gpt4 key购买 nike

是否可以创建一个带有单个参数的函数,该函数返回一个指向全局范围内返回 void 的无参数函数的指针?

我问的是嵌入式硬件,我试图在其中定义一系列中断服务例程以附加到数字引脚。

我的意思的一个例子:

#define MAX_BUTTONS 5

int main()
{
for (int i = 0; i < MAX_BUTTONS; i++) {
attachInterrupt(i, isrForI(i), RISING);
}
}

typedef void (*Isr)(void);

Isr isrForI(int i)
{
// Return a function of type Isr which calls handleInterrupt(i)
}

void handleInterrupt(int i)
{
// Do something with i
}

这里的问题是不知道如何在 isrForI 中足够通用,因为我需要它是可扩展的,这样 MAX_BUTTONS 可以是任何数字。

最佳答案

由于您在编译时知道 MAX_BUTTONS,您可能可以使用模板来避免必须创建运行时函数:

#define MAX_BUTTONS 5

typedef void (*Isr)(void);

template <int N>
void handleInterrupt() { /* int i = N; */ }


template <int N>
Isr isrForI() {
return handleInterrupt<N>;
}

template <int N>
struct attach_interrupts {
static void attach() {
attachInterrupt(N, isrForI<N>(), RISING);
attach_interrupts<N - 1>::attach();
}
};

template <>
struct attach_interrupts<0> {
static void attach() {
attachInterrupt(0, isrForI<0>(), RISING);
}
};

int main() {
attach_interrupts<MAX_BUTTONS - 1>::attach();
}

与您的代码的唯一区别是它将中断从 MAX_BUTTONS - 1 附加到 0 而不是 0MAX_BUTTONS - 1(但您可以轻松调整模板)。

正如@StoryTeller 在评论中提到的,如果你想保留handleInterrupt(int),你可以简单地做:

void handleInterrupt(int i) { /* Your original handleInterrupt... */ }

template <int N>
void handleInterrupt() {
// Call the original one:
handleInterrupt(N);
}

关于c++ - 有状态 C++ 全局 void 函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41237660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com