どのget<1>(t)
ように見えるかは、の実装によって異なりますmtuple
。典型的な実装は、各引数を保持する型から再帰的に継承するためmtuple<A,B,C>
、TupleHead<A>
(型のメンバーを持つA
) から継承し、さらに からも継承し TupleTail<B,C>
ます。 (タイプ のメンバーを持つ) およびTupleTail<B,C>
から継承します。から継承します ( type のメンバーを持ちます。)TupleHead<B>
B
TupleTail<C>
TupleTail<C>
TupleHead<C>
C
ここで、各基本クラスにも整数パラメーターを指定すると、次のようになります。
mtuple<A,B,C>
から継承しTupleHead<0,A>
、TupleTail<1,B,C>
TupleTail<1,B,C>
から継承しTupleHead<1,B>
、TupleTail<2,C>
TupleTail<2,C>
から継承TupleHead<2,C>
には、アップキャストによって取得できる型の一意の基本クラスが 1 つあり、その基本クラスのメンバーを返すget<1>
ため、比較的簡単に記述できます。mtuple
TupleHead<1,B>
B
[編集:インデックス 1 のタプル要素に対応するget<1>(m)
型を知る必要があります。そのためには、上記の再帰的な継承階層にも依存し、部分的な特殊化を使用してインデックス 1 の基本クラスを取得し、次に決定するようなものを使用しますその部分的な特殊化のパラメーター。これは私の例で示しています。]B
std::tuple_element
TupleHead<1,T>
T
B
可変個引数テンプレートで使用される手法の多くは、関数型プログラミング手法です。たとえば、テンプレート パラメーター パックの最初の要素を操作してから、すべての要素を処理するまで、パックの残りの要素に対して同じことを再帰的に実行します。テンプレート パラメーター パックで直接実行できることは、そのサイズをカウントする ( を使用) か、それを使用して別のテンプレートをインスタンス化すること以外にはあまりありません。そのため、通常のアプローチは、パックを分割してヘッドを処理sizeof...
する別のテンプレートをインスタンス化し、再帰的に行うことです。に同じことをするArgs
ArgHead, ArgsTail...
ArgsTail