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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- conceptsとSFINAEの比較
- requiresによるconceptsの定義
- テンプレートとautoでconceptsを使う
- 標準concepts:integralとRanges