2015-11-11 153 views
6

我試圖編譯下面的代碼:可變參數模板和C數組

template <typename T, int N> void foo(const T (&array)[N]) {} 

template <typename T> static int args_fwd_(T const &t) { foo(t); return 0; } 

template<class ...Us> void mycall(Us... args) { 
    int xs[] = { args_fwd_(args)... }; 
} 

int main(void) { 
    int b[4]; 
    mycall(b); 
} 

mycall功能使用可變參數模板,然後轉發到args_fwd_函數調用每個參數的函數foo

這適用於大多數參數類型(假設我已適當定義了foo函數)。但是當我嘗試傳遞一個C風格的數組(int b[4])時,它變成了一個指針,然後它找不到需要數組(不是指針)的模板foo函數。從GCC 4.9.3錯誤如下:

error: no matching function for call to ‘foo(int* const&)’ 
note: candidate is: 
note: template<class T, int N> void foo(const T (&)[N]) 
    template <typename T, int N> void foo(const T (&array)[N]) {} 
note: template argument deduction/substitution failed: 
note: mismatched types ‘const T [N]’ and ‘int* const’ 

備註尋找一個指針的部分。這在叮噹中也是如此,所以顯然這符合標準。有沒有辦法保留這是一個C數組,而不會將它轉換爲指針?

+0

有一件事要記住使用模板上的數組類型像這樣的:有針對你使用它在陣列中的每個大小的單獨的實例化。取決於程序中有多少不同大小的數組,這可能意味着大量的膨脹。 –

回答

6

是的。使用完美轉發:

#include <utility> 

template<class ...Us> void mycall(Us&&... args) { 
    int xs[] = { args_fwd_(std::forward<Us>(args))... }; 
} 
+1

完美,謝謝! – JoshG79