質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

760閲覧

C++ std::disjunction の定義について

KN2018

総合スコア18

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/10/25 13:47

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 {};

お手数をお掛けしてすみませんが、ご教授くださると大変ありがたいです。どうぞ宜しくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

最後の4行にある disjunction の定義を以下のようにすると、どのような不都合があるのか

該当行がクラステンプレートdisjunction再宣言 とみなされてしまい、1回目のプライマリ・クラステンプレート宣言template<class... _Traits> struct disjunctionとはテンプレートパラメータ宣言が一致しないためコンパイルエラーを引き起こします。
Demo: https://wandbox.org/permlink/c3DAaApNFjOXaVHk

2回目のdisjunctionがテンプレート特殊化であることを示すために、disjunction<〜>の形で宣言する必要があります。

cpp

1template <class... _Traits> 2struct disjunction; // プライマリテンプレート(A) 3 4template <class _First, class... _Rest> 5struct disjunction<_First, _Rest...>; // (A)の特殊化

投稿2021/10/30 14:05

編集2021/10/30 14:07
yohhoy

総合スコア6191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KN2018

2021/10/31 11:36

丁寧に回答を寄せてくださり、とてもありがたく思っております。 私の知識が浅いため、どのように質問をすれば適切に伝わるか分からず、お手数をお掛けしてすみません。 std::disjunction の4行の定義を、2行に縮めるとどのようなまずいことがあるのかな?、ということが知りたいことでした。 2行に縮めたバージョンを利用して、VS2019 にて利用しているのですが、宣言のみのプライマリテンプレートがなくてもコンパイルできている状態です。 やはり、元の4行の形で書かないといろいろまずいことが発生するのかな?という技術的な好奇心もあり、自分で書き換えたテンプレートを用いていろいろ書いてみている状態です。 今の所、actorbug さんに指摘されたこと以外では不具合は見つかっていないのですが、お手数をお掛けしてすみませんが、もし、不具合が発生することがあるならば、ご教授くださると大変助かります。 技術的な好奇心が先走っていて、自分の技術が追いついておらず申し訳ありませんが、どうぞ宜しくお願いいたします。 回答を書いてくださる時間を割いてくださり、本当にありがとうございました。
yohhoy

2021/11/02 04:10 編集

> std::disjunction の4行の定義を、2行に縮めるとどのようなまずいことがあるのかな? 私が質問を読み違えていたようです。 直接的な問題は std::disjunction<> (テンプレート引数ゼロ)がコンパイルエラーになることのみです。 https://cpprefjp.github.io/reference/type_traits/disjunction.html C++標準ライブラリ仕様では、テンプレート引数ゼロ=false_type となることを要求しています。
KN2018

2021/11/03 12:36

丁寧なご回答をくださり、大変ありがとうございました。 標準ライブラリの仕様など、自分で気付けていなかった点などを教えてくださり、とても勉強になりました。
guest

0

ベストアンサー

その定義だと、disjunction<>がエラーになります。

投稿2021/10/25 14:27

actorbug

総合スコア2240

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KN2018

2021/10/25 14:42

素早い回答をくださり、大変ありがとうございます! もし、disjunction<> を使わないとしたら、まったく不都合はないのでしょうか? 標準ライブラリを作成する場合、disjunction<> の考慮が必要になることは理解できました。 いま、template に関して学習をしていまして、自分用の template を作るとしたらどうなるかな、と考えている状態です。ささいなことでも気をつけるべきことがあれば是非知りたいと思っています。 もし、何かありましたら、お時間をとってすみませんが、ご教授くださると大変うれしいです。 回答をくださり、本当にありがとうございました。
actorbug

2021/10/26 11:34

不都合はないとは思いますが、自分も詳しくはないので、何か見落としがあるかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問