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

时间:2016-12-20 08:19:01

标签: c++

是否可以使用单个参数创建一个函数,该函数返回指向全局范围的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可以是任何数字。

1 个答案:

答案 0 :(得分:2)

由于您在编译时知道 <td ng-repeat="ro in room.Roms"> (@Convert.ToInt32({{ro.RRPrice}})* @Convert.ToInt32({{ ro.DiscountPercent}}))/ 100 ; </td> ,因此您可以使用模板来避免创建运行时函数:

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的中断附加到0(但您可以轻松调整模板)。< / p>

如@StoryTeller在评论中提到的,如果你想保留MAX_BUTTONS - 1,你可以这样做:

handleInterrupt(int)