標準concepts:integralとRanges
integralやranges::rangeなど、標準ライブラリのconceptsを使います。
「標準concepts:integralとRanges」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
標準コンセプトライブラリ
C++20 では、<concepts> と <ranges> に多くの標準コンセプトが導入されました。これらを知っていれば、自分でコンセプトを記述する手間を省けます。
コア言語のコンセプト
基本的なコンセプトは次のとおりです。
std::same_as<T, U>std::derived_from<T, U>std::convertible_to<T, U>std::common_with<T, U>std::assignable_from<T, U>
算術コンセプト
数値型に制限します。
std::integral— 任意の整数型std::signed_integral— 符号付き整数std::unsigned_integral— 符号なし整数std::floating_point— float、double、long double
template <std::floating_point T>
T mean(T a, T b) { return (a + b) / 2; }比較コンセプト
等価性や順序付けに関する型の制約を指定します。
std::equality_comparablestd::totally_orderedstd::three_way_comparable
オブジェクトコンセプト
一般的な要件は次のとおりです。
std::movablestd::copyablestd::default_initializablestd::semiregularstd::regular
template <std::regular T>
class Container { /* full-fledged value type */ };呼び出し可能コンセプト
関数やファンクターに使用します。
std::invocable<F, Args...>std::regular_invocable<F, Args...>std::predicate<F, Args...>
template <std::invocable<int> F>
void apply_to_42(F&& f) {
std::forward<F>(f)(42);
}イテレーターコンセプト
<iterator> で提供されています。
std::input_iteratorstd::forward_iteratorstd::bidirectional_iteratorstd::random_access_iteratorstd::contiguous_iterator
Ranges のコンセプト(C++20)
<ranges> で提供されています。
std::ranges::range— begin/end を持つstd::ranges::view— 所有権を持たない rangestd::ranges::sized_range— O(1) でサイズがわかるstd::ranges::random_access_range
template <std::ranges::range R>
auto first(R&& r) {
return *std::ranges::begin(r);
}コンセプトの組み合わせ
コンセプトを組み合わせて、要件を正確に表現します。
template <std::ranges::random_access_range R>
requires std::integral<std::ranges::range_value_t<R>>
auto sum(const R& r) {
return std::reduce(std::ranges::begin(r), std::ranges::end(r));
}標準コンセプトを基にしたカスタムコンセプト
標準コンセプトを基に、ドメイン固有のコンセプトを構築します。
template <typename T>
concept Number = std::integral<T> || std::floating_point<T>;コンセプトに基づくアルゴリズム
C++20 の ranges アルゴリズムには、厳密なコンセプト制約が付けられています。不適切な型を渡すと、どのコンセプトに違反したのかがエラーメッセージに直接示されます。
チートシート
可能な限り組み込みのコンセプトを使用してください。
- 数値 →
integral/floating_point - 反復処理 →
ranges::range - 呼び出し可能 →
invocable/predicate - 値型 →
regularまたはsemiregular
確認問題
begin() と end() の両方を持つ型を表す標準コンセプトはどれですか。
まとめ
標準ライブラリには、算術(integral、floating_point)、比較(equality_comparable)、オブジェクト(movable、regular)、呼び出し可能、イテレーター、range の豊富なコンセプトライブラリが用意されています。これらを独自の制約の基盤として使用してください。
AI チューターと学ぶ C++ — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 51
- レッスン
- 203
よくある質問
「標準concepts:integralとRanges」レッスンは無料ですか?
はい。「標準concepts:integralとRanges」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「標準concepts:integralとRanges」で何を学びますか?
integralやranges::rangeなど、標準ライブラリのconceptsを使います。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「標準concepts:integralとRanges」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- conceptsとSFINAEの比較
- requiresによるconceptsの定義
- テンプレートとautoでconceptsを使う
- 標準concepts:integralとRanges