2016-12-20 10 views
1

是否有可能創建一個函數有一個參數,它返回一個指向全局範圍無效返回,參數的功能?有狀態的C++全球空函數指針

我問在嵌入式硬件,在那裏我試圖定義了一系列的中斷服務程序的附加到數字引腳的感覺。

我的意思的例子:

#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可以是任何數字。

+0

你可以擴展你的例子來說明功能'isrFor(我)'的回報。 –

+1

你想要的狀態,但有一個裸函數指針?不是一個函數? – StoryTeller

+2

路線不明。你想立即生成這些void函數,還是要根據整型參數從現有池中選擇它們?如果是後者,它看起來像是在尋找一組函數指針。或者你的意思是相同的功能,但是附加了不同的狀態? –

回答

2

既然你在編譯時知道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 - 10而不是0MAX_BUTTONS - 1(但您可以輕鬆調整模板)。

正如意見中提到的@StoryTeller,如果你想保持handleInterrupt(int),你可以簡單地做:

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

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

值得注意的是'handleInterrupt'不一定是模板。它可以是一個常規函數,OP可以像它們最初想要的那樣將'N'作爲參數傳遞給它。 – StoryTeller

+0

@StoryTeller由於'isForI'返回一個指向第n個'handleInterrupt'函數的指針,你將如何傳遞'N'? – Holt

+0

我被名字拋出,但是如果OP已經有'handleInterrupt(int)'他們想要保留,模板體應該是'void handleInterrupt(){handleInterrupt(N); }' – StoryTeller