タグ付けされた質問 「c++-concepts」

5
なぜrequireが必要なのですか?
C ++ 20の概念の隅の1つは、作成しなければならない特定の状況があることですrequires requires。たとえば、[expr.prim.req] / 3の次の例: Aは必要-発現はまた、で使用することができ、必要句下記のようなテンプレート引数にアドホック制約を書き込む方法として([TEMP]): template<typename T> requires requires (T x) { x + x; } T add(T a, T b) { return a + b; } 最初のrequireはrequire-clauseを導入し、2番目はrequire-expressionを導入します。 その2番目のrequiresキーワードが必要になる背後にある技術的な理由は何ですか?書き込みを許可できないのはなぜですか。 template<typename T> requires (T x) { x + x; } T add(T a, T b) { return a + …
161 c++  c++-concepts  c++20 

3
概念とテンプレート制約の違いは何ですか?
C ++の完全な概念の提案とテンプレートの制約(たとえば、Dlangに表示される制約やC ++ 1yの新しいconcepts-liteの提案)の意味上の違いは何ですか? テンプレートの制約ができないよりも、本格的なコンセプトは何ができるのですか?
96 c++  c++11  d  c++-concepts 

3
C ++ 20の概念:テンプレート引数が複数の概念に該当する場合、どのテンプレートの特殊化が選択されますか?
与えられた: #include <concepts> #include <iostream> template<class T> struct wrapper; template<std::signed_integral T> struct wrapper<T> { wrapper() = default; void print() { std::cout << "signed_integral" << std::endl; } }; template<std::integral T> struct wrapper<T> { wrapper() = default; void print() { std::cout << "integral" << std::endl; } }; int main() { wrapper<int> w; …

1
`equality_comparable_with`は` common_reference`を必要とする必要がありますか?
コンセプトは、equality_­comparable_with<T, U>タイプのオブジェクトを宣言することを目的とTし、U互いに等しく比較することができ、それらがある場合、これは予想される意味を持ちます。それはいいです。 ただし、この概念もcommon_reference_t<T&, U&>存在する必要があります。主な推進力common_referenceとそれに付随する機能は、プロキシイテレータを有効にし、そのようなイテレータ間のreferenceとの関係を表す場所を設けることvalue_typeです。 それは素晴らしいことですが... a Tとa Uが互いに等しいかどうかをテストできるかどうかをテストすることとは何ですか?なぜ標準はそれTを必要とし、Uそれらを等しく比較できるようにするために共通の参照関係を持っているのですか? これは、論理的に比較可能な共通参照関係を合理的に持たない2つのタイプを持つことが非常に困難な、奇妙な状況を作り出します。例えば、vector<int>およびpmr::vector<int>論理的には同等であるべきです。しかし、そうでなければ関係のない2つのタイプの間に妥当な共通参照がないため、そうなることはありません。

1
コンセプトTSチェックはプライベートアクセス修飾子を無視します
RandomAccessIteratorを返すシーケンスがbegin / endにあるか、operator []が定義されていて非void型の値を返すという、Indexableという概念を記述したいと思います。 私は、Stroustrupの記事のアイデアをシーケンスの概念に使用し、次のように拡張しました。 template <class T> concept bool Indexable = Sequence<T> || requires(T t, size_t n) { { t[n] } -> NotVoid; }; ほとんどの場合に機能しますが、次の場合は失敗します。 struct Bad { std::vector<int> nums; private: int& operator[](size_t ind) { return nums[ind]; } }; static_assert(!Indexable<Bad>, "fail"); 何らかの理由で、私の概念は、operator []がプライベートとして定義され、trueを返すという事実を無視します。何が欠けていますか?
10 c++  c++-concepts 

1
必要な式は、囲んでいるスコープの変数を「キャプチャ」することを許可されていますか?
次の例では、関数の引数を使用してrequire式を使用し、それらを使用する式が整形式であるかどうかをテストしています。require式は引数を取りません。関数スコープ内の変数を直接使用します。 #include <cstddef> #include <vector> template<typename T> void Resize(T &v, std::size_t const n) { if constexpr (requires { v.resize(n); }) v.resize(n); } template<typename T> void Eziser(T &v, std::size_t const n) { if constexpr (requires { v.eziser(n); }) v.eziser(n); } int main() { std::vector<int> v; Resize(v, 10u); Eziser(v, 10u); } 上記のコードは、Clangコンセプトブランチでコンパイルされます。ただし、GCC10はへの呼び出しのみを受け入れますResize。GCC9 …

2
パラメーターの順序にとらわれないstd :: same_asの一般化された形式(つまり、2つ以上の型パラメーター)を実装する方法は?
バックグラウンド 概念std::same_asは順序にとらわれない(つまり、対称)ことを知っています。std::same_as<T, U>これは、std::same_as<U, T>(関連する質問)と同等です。この質問では、より一般的なものを実装したいと思います。それはtemplate <typename ... Types> concept same_are = ...、パック内の型Typesが互いに等しいかどうかをチェックします。 私の試み #include <type_traits> #include <iostream> #include <concepts> template <typename T, typename... Others> concept same_with_others = (... && std::same_as<T, Others>); template <typename... Types> concept are_same = (... && same_with_others<Types, Types...>); template< class T, class U> requires are_same<T, U> void foo(T …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.