我有一個函數Foo和一個CDelegate類。函數指針的const引用
typedef void (*typeFctPtr)(void*);
void Foo(void* dummy)
{
cout << "Foo\n";
}
class CDelegate
{
public:
CDelegate (const typeFctPtr& f_ref_Wrapper, void* f_pvSubscriber)
: m_ref_Wrapper(f_ref_Wrapper), m_pvSubscriber(f_pvSubscriber)
{
}
inline void operator()() const
{
(*m_ref_Wrapper)(0);
}
inline void operator=(const CInterruptDelegate& D)
{
}
private:
void* m_pvSubscriber;
const typeFctPtr& m_ref_Wrapper;
};
第二類有一個靜態成員static CDelegate m_Delegate;
我初始化使用這樣的構造:
CInterruptDelegate CSpi1::m_Delegate(FreeFunction, 0);
我想打電話給我的靜態對象的()操作符來調用Foo
:CSpi1::m_Delegate();
我在(*m_ref_Wrapper)(0);
得到一個異常語法有問題嗎?我不太確定我所嘗試做的事情是否可能。我有一個工作解決方案,CDelegate
的構造函數不接受函數指針的const引用,而是函數指針本身。然後,我可以在()運算符中調用該函數而不會出現問題。我想使用const引用,因爲函數指針調用不能被優化,我希望通過const引用的調用可以,因爲在編譯時應該知道所有東西。
你有沒有打過電話只是'm_ref_Wrapper(0);'? – iammilind
如果優化器能夠使用引用或指針移除間接調用,我會感到驚訝。但間接呼叫實際上並不昂貴。 –
@Cat Plus Plus,我使用這種機制在嵌入式系統中進行中斷處理。 boost :: function做我需要的一切,但是有點慢。另外,軟件正在將參數作爲函數指針。我想通過使用const引用來優化...至少嘗試:) – Mirco