6

これが可能な場合は、再帰なしで可変個引数テンプレートパラメータパックにインデックスを付けることができます。ただし、GCCはここで私の部分的な専門分野を取り上げることを拒否しています。

template <int I, typename List>
struct element_impl;

template <typename... TL, int... IL, typename T, int I, typename... TR, int... IR>
struct element_impl<I, typelist<pair<TL,IL>..., pair<T,I>, pair<TR,IR>...>> {
    typedef T type;
};

prog.cpp:' element<0, typelist<int, double, char, float, long int> >'のインスタンス化:
prog.cpp:52:34:ここからインスタンス化
prog.cpp:47:79:エラー:不完全な型の無効な使用' struct element_impl<0, typelist<pair<int, 0>, pair<double, 1>, pair<char, 2>, pair<float, 3>, pair<long int, 4> >'

GCCはバグがありますか、それとも可変個引数テンプレートの制限を無視していますか?

4

2 に答える 2

5

スペックは14.8.2.5p9と言っています

<T>Pにまたはを含む形式がある場合、それぞれのテンプレート引数リストの<i>各引数は、の対応するテンプレート引数リストの対応する引数と比較されます。のテンプレート引数リストに、最後のテンプレート引数ではないパック展開が含まれている場合、テンプレート引数リスト全体が非推定コンテキストになります。PiPAiAP

typelist<T>残念ながら、あなたはそのパターンに一致します。

于 2012-06-17T18:35:30.030 に答える
2

AFAICT、部分的な特殊化を照合するためのルールは、関数パラメーターのルールタイプの演繹と同じです。そして§14.8.2.1/1は次のように言っています:

parameter-declaration-listの最後にある関数パラメーターパックの場合 A、呼び出しの残りの各引数のタイプが、関数パラメーターパックのdeclarator-idのタイプと比較されPます各比較は、関数パラメーターパックによって展開されたテンプレートパラメーターパック内の後続の位置のテンプレート引数を推定します。parameter-declaration-listの最後にない関数パラメーターパックの場合、パラメーターパックのタイプは非推定コンテキストです。

したがって、この場合、パックTLIL推定はできず、部分的な特殊化は選択されません。

于 2012-06-17T18:15:55.567 に答える