0Pricing
C++ Academy · レッスン

requiresによるconceptsの定義

requires式と制約を使って、独自のconceptsを定義します。

「requiresによるconceptsの定義」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

conceptキーワード

template <params> concept Name = expression;でコンセプトを宣言します。式はコンパイル時に評価されるブール値でなければなりません。

template <typename T>
concept Integer = std::is_integral_v<T>;

型特性の組み合わせ

論理演算子を使用して型特性を組み合わせ、コンセプトを作成します。

template <typename T>
concept SignedInteger = std::is_integral_v<T> && std::is_signed_v<T>;

requires 式

より表現力の高い形式では、その型がサポートする必要のある操作を列挙します。

template <typename T>
concept Addable = requires(T a, T b) {
    a + b;
};

複合要件

requires の内部で、結果の型や追加の制約を指定できます。

template <typename T>
concept Number = requires(T a, T b) {
    { a + b } -> std::convertible_to<T>;
    { a * b } -> std::convertible_to<T>;
};

ネストした要件

requires 式の内部に requires を追加して、名前付きコンセプトを取り込みます。

template <typename T>
concept Sortable = requires(T t) {
    { t.begin() };
    { t.end() };
    requires std::movable<typename T::value_type>;
};

型要件

型が特定のネストした型やエイリアスを持つことを要求できます。

template <typename T>
concept HasValueType = requires {
    typename T::value_type;
};

テンプレートでのコンセプトの使用

構文は3種類あります。

// 1. Replace typename
template <Integer T>
T increment(T x) { return x + 1; }

// 2. requires after template parameters
template <typename T>
    requires Integer<T>
T increment(T x) { return x + 1; }

// 3. requires after function signature
template <typename T>
T increment(T x) requires Integer<T> {
    return x + 1;
}

コンセプトと auto パラメーター

省略形関数テンプレートにも制約を付けられます。

void process(Integer auto x) { std::cout << x; }

複数の制約

コンセプトを && や || と組み合わせます。

template <std::integral T, std::integral U>
    requires (sizeof(T) >= sizeof(U))
T promote(U value) { return static_cast<T>(value); }

命名規則

コンセプトには CamelCase を使用するコードが一般的です。一部のライブラリでは、標準ライブラリに合わせて小文字を使用します。規則を1つ選び、それを一貫して使用してください。

クラステンプレートでのコンセプト

クラステンプレートにも同じ方法で制約を付けます。

template <std::integral T>
class Counter { T value_; /* ... */ };

再利用可能なコンセプト

小さなコンセプトのライブラリを定義して、それらを組み合わせます。再利用可能なコンセプトを使うと、テンプレートの意図がコードから明確に伝わり、保守もしやすくなります。

確認問題

requires 式の内部で、a + b の結果が T に変換可能であることを確認する構文はどれですか。

まとめ

concept Name = expression でコンセプトを定義します。操作に基づく制約には、複合要件、ネストした要件、型要件を持つ requires 式を使用します。コンセプトを && や || と組み合わせることで、複雑な制約を表現できます。

よくある質問

「requiresによるconceptsの定義」レッスンは無料ですか?

はい。「requiresによるconceptsの定義」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「requiresによるconceptsの定義」で何を学びますか?

requires式と制約を使って、独自のconceptsを定義します。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「requiresによるconceptsの定義」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

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

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