問題タブ [c++-concepts]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 友達のようにアクセスできる C++ のコンセプト
このコードを思い通りに動作させることは可能ですか? つまり、コンセプトがプライベートメンバー機能にアクセスできるようにしますか?
ありがとう
c++ - C++ 制約 enable_if と requires の比較
C++ のrequiresキーワードに沿って実行したところ、これまでの理解が正しいかどうかを知りたいと思います。require と enable_if の両方が、テンプレートのコンパイル時間の制約を提供します。必要な場合は、制約がまったく含まれます。
requiresが関数パラメーターを制約する方法を提供する場合、enable_ifは、コンパイル時の変換をテンプレート型自体の特定の条件に制限することを主な目的としています。
例:
この概念は、pA と pB を追加できる場合にのみ機能するはずですが、enable_if 条件は評価を整数型に制限します。
これが正しいかどうか教えてくれてありがとう!
PS: require制約の構文については、まだよくわかりません。さらに、現時点ではどのコンパイラがそれらを受け入れるかわからないので、ヒントをありがとう!
c++ - 生成されたテンプレートで特定の概念制約が重複しているのはなぜですか?
g++ 6.1.0 (Debian パッケージ バージョン 6.1.1-1、 flags -std=c++17 -fconcepts
) を使用して C++ の概念の実験を始めたところですが、次の簡略化された例では理解できないエラー メッセージが表示されました。
このコードでは、バージョン 1 とバージョン 2 の両方が正常にコンパイルされ、期待される実行結果が得られます。ただし、バージョン 3 では、次のエラー メッセージが表示されます。
エラー メッセージから、何らかの理由で、生成されたテンプレートで InputIterator および InputPredicate テンプレート パラメーターの重複したバージョンが生成されているように見えます。特にバージョン2が機能したことを考えると、なぜこれが起こるのかわかりません。cppreference.com のステートメントを誤解していますか: 「同等の制約付き型指定子によって導入されたすべてのプレースホルダーには、同じ発明されたテンプレート パラメーターがあります」? それとも、これはおそらく gcc のバグですか?
c++ - SFINAE、制約、または概念を使用して専門化を制限していますか?
次のプログラムは正常に実行されます。
構造体 B と C をコンパイル時に明示的に宣言し、アプリにとって意味のある特殊化のみを許可することが重要です。
しかし、上記のコードに見られるように、下流の開発者 (いつか!) が、意味的に意味をなさない構文的に正しいパターンを作成できる可能性があります。具体的には、アプリは、クラスと関数の型が等しい型の使用方法しか認識していません。残りは無意味です。
これは、SFINAE、Constraints、Concepts などの新しい C++17+ 機能の 1 つのケースのようです。私はこれらについて読んでいますが、その選択をする判断はまだありません. Alternatives の下の cppreference では、コンパイラが機能している場合 (私は VS2015 を使用しています)、SFINAE の代わりに Concepts を提案しています。
型名 J が型名 U と同じになるように制約するにはどうすればよいでしょうか?
c++ - 制約されたテンプレート メンバー関数を必要とする概念定義
注: 以下はすべて、GCC 6.1 のコンセプト TS 実装を使用しています。
Surface
次のようなコンセプトがあるとしましょう。
Drawable
ここで、メンバー関数を持つ任意の型に一致する別の概念 を定義したいと思います。
すなわち
つまり、 aは、要件を満たす何かへの左辺値参照を取るDrawable
テンプレート化された const メンバー関数を持つものです。これは言葉で指定するのはかなり簡単ですが、Concepts TS を使用して C++ でそれを行う方法を完全に理解することはできません。「明らかな」構文は機能しません。draw()
Surface
エラー: 'auto' パラメータはこのコンテキストでは許可されていません
2 番目のテンプレート パラメーターを追加すると、コンセプトの定義をコンパイルできますが、次のようになります。
テンプレート引数の推測/置換に失敗しました: テンプレート パラメーター 'S' を推測できませんでした
現在、特定の < Drawable
, Surface
>ペアDrawable
が概念に一致するかどうかのみを確認できますが、これは正しくありません。(型には、必要なメンバー関数があるか、ないかのいずれかです。それは、どの特定の項目をチェックするかD
に依存しません。)Surface
私が求めていることは可能だと確信していますが、構文を理解することはできず、オンラインにはまだあまり多くの例がありません. 型が制約されたテンプレート メンバー関数を持つ必要がある概念定義を記述する方法を知っている人はいますか?
c++ - GCC 6.1 で概念 TS を検出する
GCC 6.1 でコンセプト TS の存在を検出するにはどうすればよいですか?
このページ__cpp_experimental_concepts
では、概念 TS をサポートする実装でマクロを事前定義する必要があることを提案しています。ただし、次のテスト プログラムは、-fconcepts
フラグを使用して GCC 6.1 でエラーなしでコンパイルされます。
static_assert
( が起動するか、concept
キーワードが認識されなくなることを期待します。)
コンセプトが利用可能かどうかに基づいてコードを条件付きでコンパイルする他の方法を知っている人はいますか?
c++ - std::vector の再割り当て量を決定するカスタム アロケータを作成できますか?
私の理解では、カスタム アロケーターは Allocator Conceptの要件に適合する必要があります。ただし、そのインターフェイスに基づいて、ベクトルが予約を使い果たしたときに新しい割り当て量を選択する方法がわかりません。
たとえば、私のマシンの現在の実装ではreserve
、push_back()
. 遅くてメモリを意識したカスタムアロケータを提供したいと思います。capacity+1
新しい要素に対応する ために以前のもののみを割り当てます。
これらは、私が見ている概念のインターフェースです。
私は次のように定型的なアロケーターを作成しました:
関数を見るallocate
:
ここでメモリを多かれ少なかれ割り当てることはできますが、現在の容量が何であるかを認識できるように、それをベクトルに報告する方法がわかりません。
これはアロケータの責任範囲外ではないでしょうか?
c++ - テンプレートクラスをパラメーターとして取るファンクターの概念を定義するにはどうすればよいですか?
数値シミュレーション用のプログラムを書いています。私の関数の 1 つがコールバックを受け取ります。関数はテンプレート関数として実装され、コールバックはテンプレート クラスとして実装されるため、コールバックへの呼び出しをインライン化できます。
現在、私の関数は複雑になってきており、明確に定義された自動チェック可能な方法でコールバックのシグネチャを宣言したいと考えています。そこで、C++ Concepts TS に注目しました。
そして、ここに問題があります。std::array
たとえば、を取るファンクタの概念を定義したいと思います
注: これは単純化された例です。ファンクターのシグネチャーを変更する (例えばstd::array
、イテレーターのペアに変更する) ことは不可能ではありませんが、好ましくはありません。
sum
以上の共通インターフェースを表す概念をどのように記述するavg
か?
最初に試しました:
しかし、これは(私の意見では)醜いコードにつながります。コールバックを使用するテンプレート関数の定義では、その宣言は次のようになります。
この<double, 1>
部分は、コンパイルに合格するために必要なダミーです。のテンプレート引数callback.operator()
が内部で変更される可能性があるため、この解決策はほとんど受け入れられませんsimulate
。さまざまなタイプとサイズのstd::array
s を渡すことができます。
2番目に試した:
このコードは、requires-expression で Constrained-type-specifier を使用する形式が正しくないため、形式が正しくありません (参照: https://groups.google.com/a/isocpp.org/forum/m/#!topic/concepts /_gHn0wJJNGA )。ところで、gcc 6.1.0 はそれに対して内部コンパイル エラーを生成します。
では、問題は次のとおりです。テンプレート クラスをパラメーターとして受け取るファンクターの概念を定義するにはどうすればよいでしょうか (できれば回避策なしで)。
調べてみると、C++ の概念はこのような用途向けに設計されていない可能性があるという印象を受けました。C++ の概念に代わるものへの提案も大歓迎です。
( Concepts Lite を使用してメンバー関数テンプレートを持つ型の概念を指定することに関連している可能性がありますが、重複しているかどうかはわかりません)