2015-11-07 32 views
0

我正在處理可能無效的原始函數指針(指向不正確的函數)/ null如果應用程序(源不可用)我與更新進行交互。我想創建一個繼承std :: function的類,它會重載operator(),並在每次調用類時向stdout發送消息,然後調用原始函數指針。這將完成,所以我將能夠輕鬆地隔離哪個函數會因空調用而崩潰。我並不擔心開銷,因爲只有在使用_DEBUG時才能在調試模式下使用它。因爲STL的實現取決於編譯器,並且從編譯器繼承它通常是一個壞主意,所以我不確定如何執行這個。我使用的編譯器是MSVC(2015)。通過繼承代理std ::函數

我該怎麼做?

+0

爲什麼你不寫一個包裝呢? – vsoftco

+0

,因爲在發佈模式,我希望它是原始的std ::函數,編寫一個包裝將需要我實現所有std :: function函數。例如:#ifdef _DEBUG使用FunctionPointer = DebugFunction; #else使用FunctionPointer = std :: function; #endif – otc

回答

0
template < typename Signature > 
struct function_decorator 
{ 
    template < typename Fun > 
    function_decorator(Fun f) 
     : fun(f) 
    {} 

    template < typename ... Pack > 
    auto operator()(Pack ... args) const 
    { 
     return fun(std::forward<Pack>(args)...); 
    } 

private: 
    std::function<Signature> fun; 
}; 

對於一個快速和骯髒的實現,我認爲會工作。

+1

你可能想'迴歸樂趣(std :: forward (args)...);'爲了完美的轉發。 – vsoftco