2014-11-24 149 views
0

將函數(使用相同的輸入參數/返回類型)作爲參數傳遞給另一個函數,而不使用函數指針的正確方法是什麼?我希望傳入的函數參數在被調用時被內聯?那麼,我只是不希望指針間接。將C++函數作爲參數傳遞,而不使用函數指針/內聯?

我發現這一點:

Pass a function as an explicit template parameter

,但它似乎是使用函數指針。

編輯:我真的很希望避免必須創建結構來存儲每個函數參數的行爲。

回答

1

如果你知道在編譯時的專業化,你只需要通過類型信息:

void inlined_function() {}; // function you want to pass 

template<typename F> void caller1() { 
    inlined_function(); // not passed through pointer, call inline 
} 

如果您有內聯函數的控制,實現它作爲一個函子:

struct X { 
    inline void operator()() // inline function 
    { 
    } 
}; 

template<typename F> void caller2(F functor) { 
    functor(); // inline call 
} 

客戶代碼爲兩種變體:

caller1<inlined_function>(); 
caller2(X{}); 

編輯

如果您沒有控制權將函子作爲結構寫入,請爲其編寫一個內聯結構包裝器。例如,你有void inlined_function() {};,需要寫caller2在這種情況下,寫類似X調用inlined_function,或(更好的)算符,拉姆達:

template<typename F> void caller2(F functor) { 
    functor(); // inline call 
} 

caller2([](){ inlined_functor(); }); 
+0

嘿,我喜歡你的想法編輯。所以inlined_functor()也可以有inlined_functor2(),這些仍然是同一類中的普通方法? – user997112 2014-11-24 10:55:35

+0

@ user997112 - 是的。內聯函數互相調用將導致內聯操作。 – utnapistim 2014-11-24 11:33:15