2013-11-23 23 views
1

我試圖找到一種方法來提取參數的類型和數量和返回類型的函數指針,所以我可以寫的東西是這樣的:提取函數指針參數和返回值

int foo(int x, int y) 
{ 
    return x+y; 
} 

template<class T, class U> 
U callfunc(T, ...); 

int main() 
{ 
    int k = callfunc(&foo, 3, 5); 
} 

callfunc將檢查參數的數量和類型是正確的,並返回結果。但如何實施?

我google了一下,發現一些文章覆蓋了類似的主題使用宏和模板,但仍然無法做到這一點。

有人可以提供一些指針?

謝謝!

P.S:我不能使用可變模板,因爲VS2012不支持它。

回答

1

你會想一些可變參數模板,一樣的東西:

template<typename TResult, typename ...TArgs> 
TResult callfunc(TResult (*fn)(TArgs...), TArgs... args) 
{ 
    /* do something with the args, if you wanted */ 
    TResult result = fn(std::forward(args)...); 
    /* do something to the return value, if you wanted */ 
    return std::forward(result); 
} 
+0

VS2012不具有可變參數模板支持...是否有另一種方式做到這一點? –

+0

@TiagoCosta:我很確定沒有任何其他好方法。我相信VS2012團隊通過使用宏來創建具有不同數量參數的大量函數重載來模擬可變參數模板。我會試着找到一些相關的博客文章,看看是否有你可以複製的例子。 –

+1

[這是它](http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx)看看'shared'和'xxshared'頭文件,看看'std :: make_shared'的行爲是假的 - 可變參數宏,它轉發的方式與您的示例幾乎完全相同,只是它轉發給構造函數而不是自由函數。 –