2015-05-31 113 views
2

我的以下示例使用可變參數模板註冊一個類的內部的功能。註冊單個函數可以工作,但類成員函數又如何?我試過std :: bind,但是這期望佔位符不是一個選項,因爲我不知道參數的數量。有沒有一種簡單的方法在C++ 11中執行此操作,還是我不得不爲每個參數實現註冊函數?C++成員函數結合具有可變參數模板

template<typename TReturn, typename... TArgs> 
class Func { 
    std::function<TReturn (TArgs...)> fn; 

    template<typename TFunction, typename TObject> 
    bool register(TFunction f, TObject obj){ 

    } 

    bool register(std::function<TReturn (TArgs...)> f){ 
     fn = f; 
     return true; 
    } 
} 
+0

你不會有太多的樂趣調用一個函數'register'因爲這標識符是關鍵字。更重要的是,你似乎有兩個名字和一個沒有實現的函數:你期望函數做什麼? –

+0

我忘了更改名稱。你說得對,這是行不通的。讓我們忘記第二個功能。我想要的是在fn中存儲一個類成員函數。 – Gustavo

+0

你不需要爲成員函數分開過載,用戶可以使用過載服用'的std :: function',並通過'的std ::綁定(&X ::樓OBJ,ARGS ...)'或一個合適的函子。 – 0x499602D2

回答

3

創建一個帶有所需簽名的lambda函數並從中構造std::function對象。

template<typename TReturn, typename... TArgs> 
class Func { 
    std::function<TReturn (TArgs...)> fn; 

    template<typename TFunction, typename TObject> 
    bool Register(TFunction f, TObject obj){ 
     fn = [obj](TArgs... args){return (obj.*f)(args...);}; 
     return true; 
    } 

    bool Register(std::function<TReturn (TArgs...)> f){ 
     fn = f; 
     return true; 
    } 
} 

(注意:Member function pointers需要與一個相應的對象,對象的引用或指針到適當的類的對象被用於如果TObject是值狀,所述成員函數調用語法將(obj.*f)如果。 TObject是指針狀,語法爲(obj->*f)

+0

fn = [&](TArgs ... args){return(obj - > * f)(args ...);};但在調用fn時會出現分段錯誤。非類成員函數效果很好。 – Gustavo

+1

@Gustavo將調用改爲'(obj。* f)(args ...)'。解除引用的綁定比調用弱。如果您繼續發生seg故障,我們需要一個可重現的例子。 – 0x499602D2

+0

這不會編譯,因爲我將指向該對象的指針指向寄存器函數。 – Gustavo

相關問題