このようにパラメータパックの最初の要素を取得することが可能です
template <typename... Elements>
struct type_list
{
};
template <typename TypeList>
struct type_list_first_element
{
};
template <typename FirstElement, typename... OtherElements>
struct type_list_first_element<type_list<FirstElement, OtherElements...>>
{
typedef FirstElement type;
};
int main()
{
typedef type_list<int, float, char> list;
typedef type_list_first_element<list>::type element;
return 0;
}
しかし、このような最後の要素を同様に取得することはできません
template <typename... Elements>
struct type_list
{
};
template <typename TypeList>
struct type_list_last_element
{
};
template <typename LastElement, typename... OtherElements>
struct type_list_last_element<type_list<OtherElements..., LastElement>>
{
typedef LastElement type;
};
int main()
{
typedef type_list<int, float, char> list;
typedef type_list_last_element<list>::type element;
return 0;
}
gcc 4.7.1で不平を言う:
エラー: 'struct type_list_last_element<type_list<int, float, char>>' の 'type' に型の名前がありません
標準のどのパラグラフがこの動作を説明していますか?
テンプレート パラメーター パックは、一致するすべての引数を消費するという意味で貪欲であるように思われます。この場合、OtherElements
は 3 つの引数 ( int
、float
およびchar
) をすべて消費し、何も残っていないLastElement
ため、コンパイルは失敗します。私は仮定で正しいですか?
編集:
明確にするために:パラメーターパックから最後の要素を抽出する方法を尋ねているのではなく、その方法を知っています。私が実際に望んでいるのは、前面ではなく背面からパックを選択することです。そのため、各要素の背面までずっと再帰することは効果がありません。明らかに、シーケンスを事前に逆にすることが最も賢明な選択です。