其實,模板參數包和默認參數不有是最後一個功能,如果任何涉及將推斷後(或默認):
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...>>{};
來源
2012-08-10 11:22:33
Xeo