2014-03-06 77 views
1

我想寫一個teamplate功能,看起來像這樣:可變參數模板調用一個函數

template<T FuncPtr, Params...> 
void CallFunction(Params...) 
{ 
    FuncPtr(Params...); 
} 

用法示例:

typedef void (__stdcall* Test_t)(int a1, bool a2, char* a3); 
Test_t fn = ....; //pointer obtained somehow 

CallFunction<fn>(10, true, "Hello"); 

是類似的東西可能嗎?我不知道如何使用參數包進行解壓縮,以便將包服務器的每個成員作爲參數。

回答

0

我建議未成年改寫成這樣:

#include <iostream> 

template<class Fun, class... Args> 
void CallFunction(Fun fun, Args&&... args) 
{ 
    fun(std::forward<Args>(args)...); 
} 

void fn(int a1, bool a2, char const* a3) 
{ 
    std::cout << a1 << a2 << a3;  
} 

int main() 
{ 
    CallFunction(fn, 10, true, "Hello"); 
} 

Live Example。我想你可以從這個推斷的正確...語法(在放慢參數列表class...後,但arg...在通話現場的拆包參數之後。

std::forward是左值和右值的區別。它在總體上也比較好通過傳遞函數指針(或一般可調用對象)作爲一個經常性功能的說法,而不是作爲一個明確的模板參數使用參數推導。

+0

THX兄弟,這是工作的很好。即時通訊新的這個可變參數模板的東西,從來沒有見過前進以前,你每天都會學到新的東西:) – user2276094

相關問題