Visual Studio 2019 Version 16.11.2 を用いて、std::disjunction の定義について調べていたら、以下のようになっていました。
一般的によく知られてるヘッダを長々と書くと分かりにくいと思いますので、std::integral_constant の定義は省略しています。
cpp
1template <bool _Val> 2using bool_constant = integral_constant<bool, _Val>; 3using true_type = bool_constant<true>; 4using false_type = bool_constant<false>; 5 6 7template <bool _First_value, class _First, class... _Rest> 8struct _Disjunction { using type = _First; }; 9 10template <class _False, class _Next, class... _Rest> 11struct _Disjunction<false, _False, _Next, _Rest...> { 12 using type = typename _Disjunction<_Next::value, _Next, _Rest...>::type; 13}; 14 15 16template <class... _Traits> 17struct disjunction : false_type {}; 18 19template <class _First, class... _Rest> 20struct disjunction<_First, _Rest...> : _Disjunction<_First::value, _First, _Rest...>::type {};
上記の動作は理解できるのですが、私は template の知識が浅いため、最後の4行にある disjunction の定義を以下のようにすると、どのような不都合があるのか思いつきませんでした。
cpp
1template <class _First, class... _Rest> 2struct disjunction : _Disjunction<_First::value, _First, _Rest...>::type {};
お手数をお掛けしてすみませんが、ご教授くださると大変ありがたいです。どうぞ宜しくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/31 11:36
2021/11/02 04:10 編集
2021/11/03 12:36