2013-01-05 268 views
1

我期待接受一個模板成員函數作爲模板參數。爲模板的成員函數指針作爲模板參數

例如,假定這個類:

class A 
{ 
public: 
    template<typename... Args> 
    void Foo(Args...) {} 

    void Bar() {} 
}; 

我想能夠調用:

Invoke<&A::Foo>(5, true); 

而且有這樣的類似呼籲:

A a; 
a.Foo(5, true); 

我知道如何做到這一點Bar()

template<void (A::*F)()> 
void Invoke() 
{ 
    A a; 
    (a.*F)(); 
} 

int main() 
{ 
    Invoke<&A::Bar>(); 
} 

是否有可能將其擴展到一個模板成員函數的指針?或者類似地,編寫一個像這樣的轉發函數,可以處理任何參數類型的函數。這是不行的,但一些類似:

template<typename... Args, void (A::*F)(Args...)> 
void Invoke(Args... args) 
{ 
    A a; 
    (a.*F)(args...); 
} 

我能看到爲什麼這也許是不可能的,但如果這是真的你能指向標準爲何?我也想了解更多關於標準的細節。

+0

嘗試'調用<&A ::美孚>(5,真)'。如果可行,編寫一個類型推導封裝*函數*模板。 –

+0

@KerrekSB但我不知道如何指定在調用應該接受與此簽名的函數(沒有硬編碼)的函數類型,因爲你似乎有當您指定的成員函數指針類型指定的參數。 – JaredC

+0

好了,你可以讓'Invoke'一個更強大的模板...... –

回答

2

是否有可能將其擴展到一個模板成員函數的指針?

號但如果你只是需要的Foo的特定實例可以使用Invoke<&A::Foo<int, bool>>

或者類似地,寫一個像這樣的轉發函數可以處理任何參數類型的函數。

爲了能夠使用不同的簽名工作,你將不得不修改Invoke對任何類型的可調用對象的操作。然後,你就必須定義一個調用對象調用您的實際功能:

struct callable_foo 
{ 
    explicit callable_foo(A& obj) : _obj(obj){} 

    template< typename ...Args > 
    void operator()(Args&&... args) 
    { 
     _obj.Foo(std::forward<Args>(args)...); 
    } 

    A& _obj; 
} 
+0

你的意思是'的std ::向前(參數)...'而不是'的std ::向前(參數)'? – Nawaz

+0

@Nawaz:對,謝謝。仍在追趕_完美轉發_ –

相關問題