- C++相談室 part144
933 :デフォルトの名無しさん[sage]:2019/09/09(月) 18:33:38.13 ID:G9jMTORL - また質問させてください。
VS2019 の tuple の実装を調べていて、utility というヘッダファイルに以下の ようなコードを見つけました。自分の直感では、これは、パターンマッチングを していると思うんですが、実は、以下の (1) にマッチングする場合、 (2) にもマッチングする場合があります。しかし、現実には (1) にマッチングする 場合には、コンパイラは (2) を無視して (1) だけを採用する必要があると 思うんですが、template には、マッチングに優先順位があって、定義した 順にマッチングするかを調べて、一番最初にマッチングしたものを採用して それ以後のものは無視すると言うような規則があるのでしょうか? // (1) template <class _This, class... _Rest> struct _Tuple_element<_This, tuple<_This, _Rest...>> { // select first element using _Check_type = int; static_assert( is_void_v<typename _Tuple_element<_This, tuple<_Rest...>>::_Check_type>, "duplicate type T in get<T>(tuple)"); using type = _This; using _Ttype = tuple<_This, _Rest...>; }; // (2) template <class _Ty, class _This, class... _Rest> struct _Tuple_element<_Ty, tuple<_This, _Rest...>> : _Tuple_element<_Ty, tuple<_Rest...>> { // recursive _Tuple_element definition };
|