2012-08-10 59 views
12

我有點困惑,因爲默認參數模板和可變參數模板參數都必須是模板的最後一個參數。那麼我的函數的官方語法是什麼?默認參數模板vs variadic模板:最後一個模板參數是什麼?

template<typename T, class T2 = double, unsigned int... TDIM> myFunction(/* SOMETHING */) 

template<typename T, unsigned int... TDIM, class T2 = double> myFunction(/* SOMETHING */) 

回答

17

其實,模板參數包和默認參數不是最後一個功能,如果任何涉及將推斷後(或默認):

template<class T, class... Args, class T2 = int, class T3> 
void f(T3){} 

請注意,你不能爲T2指定什麼,因爲一切都將通過一個可變包被吞噬。最後,我想說,如果要手動指定默認參數,請將可變參數包放在默認參數後面。對於推斷包裝,它更像是一種風格選擇,我個人會把它們放在最後。

需要注意的是,如果他們推導出另一個模板的一部分,你甚至可以有多個可變參數組:

template<class...> struct pack{}; 

template<class T, class... P1, class... P2, class T2> 
void f(pack<P1...>, pack<P2...>, T2){} 

在這樣的情況下,我把相關的包裝和其他模板參數到他們的功能參數,即按照相同的順序。

對於(主要)類模板,當然這是不同的,因爲不能推導出參數。事實上,可變參數包是在模板參數列表的末尾:

template<class T, class... Args, class T2=int> 
struct X{}; // error 

對於部分特例,順序並不重要,它再次一個純粹的風格上的選擇。我個人會像之前一樣將它們放在主模板的參數中。

template<class T1, class T2> 
struct X{}; 

template<template<class...> class T1, class... A1, 
    template<class...> class T2, class... A2> 
struct X<T1<A1...>, T2<A2...>>{};