我有兩個類用於表示一些硬件:一個Button和一個InputPin類,它們代表一個按鈕,當按下按鈕時它將更改IC輸入引腳的值。他們中的一個簡單的例子是:類模板實例化:圍繞此循環引用的任何方式?
template <int pinNumber> class InputPin
{
static bool IsHigh()
{
return ((*portAddress) & (1<<pinNumber));
}
};
template <typename InputPin> class Button
{
static bool IsPressed()
{
return !InputPin::IsHigh();
}
};
這精美的作品,並通過使用類模板,下面的條件將編譯儘可能緊,如果我在組裝手寫它(單指令)。
Button < InputPin<1> > powerButton;
if (powerButton.IsPressed())
........;
但是,我擴展它來處理中斷和循環引用有問題。
與原始InputPin相比,新的InputPinIRQ類具有額外的靜態成員函數,當引腳值發生變化時,該函數將由硬件自動調用。我希望它能夠通知Button的這個類,以便Button類可以通知主應用程序它已被按下/釋放。我目前正在通過傳遞指向回調函數的方式來做到這一點。爲了使回調代碼由編譯器內聯,我相信需要將這些函數指針作爲模板參數傳遞。所以現在,這兩個新類都有一個額外的模板參數,它是一個指向回調函數的指針。不幸的是這給了我一個循環引用,因爲實例化一個ButtonIRQ類我現在必須做這樣的事情:
ButtonIRQ<InputPinIRQ<1, ButtonIRQ<Inp....>::OnPinChange>, OnButtonChange> pB;
其中......代表循環引用。
有誰知道我該如何避免這個循環引用?我對模板很陌生,所以可能會錯過一些非常簡單的東西。
ps。編譯器確切地知道中斷髮生時將運行的代碼是非常重要的,因爲它會進行一些非常有用的優化 - 它能夠內聯回調函數,並將回調函數的代碼字面地插入在ah/w中斷。
我可能是錯的,但是對於傳統的主題/觀察者,是不是指向存儲在運行時迭代的表中的觀察者函數?這不幸的是膨脹了我的代碼,迫使我回到C風格的非對象定向編程。 應該可以做到這一點 - 它是確定性的,編譯器知道在中斷髮生時應該運行哪些代碼。但是,我如何獲取它來內聯代碼,而不使用函數指針作爲模板參數? (這導致循環參考)?我可以以不同的方式實例化這些類嗎? – TimYorke34 2010-06-15 20:23:56