実際、テンプレート パラメーター パックとデフォルト パラメーターは、関数の最後にある必要はありません。
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...>>{};