2014-10-09 86 views
17

假設我們有一個類功能爲可變參數模板參數

template <int(*F)(int, int)> 
class A { 
    // ... 
}; 

它將一個函數作爲模板參數。

現在我想創建一個可變參數模板,它將函數作爲模板參數。

template <int(*F...)(int, int)> // this won't compile 
template <int(*F)(int, int)...> // this won't compile either 

如何正確地做到這一點?

+1

那麼你得到什麼編譯錯誤? – Useless 2014-10-09 08:37:41

+2

省略號總是在名稱前面,在這種情況下是'F'。 – leemes 2014-10-09 08:38:12

回答

12
template <int(*...F)(int, int)> 
class A { 
    // ... 
}; 
18

你可以做

using Function_t = int(*)(int, int); 

template <Function_t ... Fs> struct s{}; 

否則,如果你不想的typedef

template <int(*...Fs)(int, int)> struct s{}; 

注意使用:第二個版本不能匿名(Fs是必需的)爲ISO C++ 11要求帶圓括號的包裝聲明有一個名稱。

3

只需使用F作爲模板參數。 這不僅可以使用函數作爲參數,還可以使用實現括號操作符的其他類型。 這些類被稱爲函子

+4

可能是一個明智的建議,但不是解決問題的辦法。另請注意,這裏的函數本身就是模板參數,而不僅僅是它們的類型。在你的情況下,函數的類型將是模板參數,但是(取決於它們在哪裏使用),你需要將它們作爲函數參數傳遞。 – leemes 2014-10-09 08:46:31

2

函數指針類型的語法很煩人。因此,圍繞它的代碼:

template<class T> using type=T; 

template< type<int(int,int)>* ... Fs > 
class A { 
}; 
+0

雖然有趣,這些類型函數使用不同的語法看起來很奇怪恕我直言。也許'指針'? – dyp 2014-10-09 18:40:33

+0

@dyp我希望事情像「正常」變量一樣從左到右閱讀,而'pointer '不這樣做。 – Yakk 2014-10-09 18:52:17

+0

那麼你可以開始聲明像這樣的正常變量:'pointer x;陣列f;參考 >>> s;';) - hmm命名類型運算符? – dyp 2014-10-09 19:12:28