- C++相談室 part144
937 :デフォルトの名無しさん[sage]:2019/09/10(火) 01:40:29.13 ID:wmYy4ZD0 - >>934
ちなみに、C++ における tuple とは、異なる型のオブジェクトの集合体のような もので、get<idx>(tpl) とすると idx 番目の要素が参照できます。 動的配列 vector、リンクリスト list は同じ型の集合体ですが、tupleは char, int, string 任意の順番で任意個数入れたりするようなことが可能です。 tuple は class を次々に継承することで実現され、N個の要素の場合は、 (N - 1) 回継承されて実現されています。 get<idx>(tpl) は、コンパイル段階で静的に型が決まるようになっており、 idx を 1 ずつ減らしながら idxが0 になるまでtemplateを再帰的に具現化(展開)し て行っています。その際、基本クラスへの「cast」を利用して上手く実装されています。 get<TYPE>(tpl) は、その TYPE 版で、tuple の中の TYPE 型の要素を取り出すもので、 TYPEの要素が一個だけであることを仮定しています。 >>934 の using _Ttype = typename _Tuple_element<_Ty, tuple<_Types...>>::_Ttype; return ((_Ttype&) _Tuple)._Myfirst._Val; の部分は、丁度 TYPE = _Ty の場合のもので _Tuple_element<_Ty, tuple<_Types...>> の部分が、再帰的に template 具現化を使って _Ty の型の要素が先頭になるまで tuple の要素を減らす処理を行っており、_Ttype には、その tuple の型が入ります。 次の return 文は、cast を行っている部分です。 >>933 の(2)は、再帰的に tuple の先頭の要素を除去して行くマクロで、(1)は、 tuple の先頭が _Type になった場合にマクロ展開の動作を停止するためのものです。
|