C++ Academy · レッスン

標準concepts:integralとRanges

integralやranges::rangeなど、標準ライブラリのconceptsを使います。

レッスン 4/414 ステップ

「標準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_comparable
  • std::totally_ordered
  • std::three_way_comparable

オブジェクトコンセプト

一般的な要件は次のとおりです。

  • std::movable
  • std::copyable
  • std::default_initializable
  • std::semiregular
  • std::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_iterator
  • std::forward_iterator
  • std::bidirectional_iterator
  • std::random_access_iterator
  • std::contiguous_iterator

Ranges のコンセプト(C++20)

<ranges> で提供されています。

  • std::ranges::range — begin/end を持つ
  • std::ranges::view — 所有権を持たない range
  • std::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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. conceptsとSFINAEの比較
  2. requiresによるconceptsの定義
  3. テンプレートとautoでconceptsを使う
  4. 標準concepts:integralとRanges
← C++ Academyに戻る