テンプレートとautoでconceptsを使う
conceptsで関数テンプレートと簡略関数テンプレートに制約を付けます。
「テンプレートとautoでconceptsを使う」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
3種類の構文のまとめ
コンセプトは、テンプレートパラメーターのプレフィックス、requires 節、省略形関数テンプレート構文の3通りで適用できます。
プレフィックス構文
typename をコンセプト名に置き換えます。
template <std::integral T>
T add(T a, T b) { return a + b; }requires 節の構文
テンプレートパラメーターリストの後に requires を追加します。最も柔軟で、複雑な条件にも対応できます。
template <typename T>
requires std::integral<T> || std::floating_point<T>
T add(T a, T b) { return a + b; }末尾の requires 節
関数シグネチャの後に requires を置きます。パラメーターに依存する制約をメンバー関数に指定する場合に便利です。
template <typename T>
class Container {
public:
void sort() requires std::sortable<T> { /* ... */ }
};省略形関数テンプレート
パラメーターに auto を使用し、制約を付けます。コンパイラーが内部でテンプレートを生成します。
void greet(std::convertible_to<std::string> auto name) {
std::cout << "Hello " << name;
}複数の auto パラメーター
各 auto に独自のコンセプトを指定できます。各 auto は独立したテンプレートパラメーターを作成します。
auto multiply(std::integral auto a, std::integral auto b) {
return a * b;
}クラステンプレートとコンセプト
同じ3種類の構文を使用できます。
template <std::movable T>
class Buffer { /* ... */ };
template <typename T>
requires std::default_initializable<T>
class Storage { /* ... */ };制約付きラムダ(C++20)
ラムダには、コンセプトを使用した明示的なテンプレートパラメーターを指定できます。
auto print = []<std::integral T>(T x) {
std::cout << x << " is integral";
};
print(42);コンセプトに基づくオーバーロード解決
一致するオーバーロードのうち、最も制約の強いものがコンパイラーによって選択されます。より具体的なコンセプトが、より一般的なコンセプトより優先されます。
void process(std::integral auto x) { std::cout << "int\n"; }
void process(std::signed_integral auto x) { std::cout << "signed\n"; }
process(42); // calls signed_integral version制約付きメンバー関数
クラステンプレートのメンバーにも、それぞれ独自の制約を付けられます。
template <typename T>
class Optional {
T value_;
public:
void clear() requires std::is_trivially_destructible_v<T> { /* fast */ }
void clear() { /* general */ }
};デフォルト初期化される制約付き型
requires とデフォルト値を組み合わせると、意図が明確で読みやすいテンプレートを記述できます。
スタイルガイド
一般的なケースではプレフィックス構文を使用してください。制約が複雑であったり複数の型に関係したりする場合は、requires に切り替えます。短く目的が明確な関数には、省略形関数テンプレートを使用してください。
確認問題
「任意の整数値を受け取る関数」を表す省略形関数テンプレートの構文はどれですか。
まとめ
コンセプトは、プレフィックス、requires 節、または省略形関数テンプレートで適用できます。一致するオーバーロードのうち、最も制約の強いものが選択されます。単純な場合はプレフィックス、複雑な場合は requires、短い関数には省略形というように、適切な最も簡潔な構文を使用してください。
よくある質問
「テンプレートとautoでconceptsを使う」レッスンは無料ですか?
はい。「テンプレートとautoでconceptsを使う」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「テンプレートとautoでconceptsを使う」で何を学びますか?
conceptsで関数テンプレートと簡略関数テンプレートに制約を付けます。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「テンプレートとautoでconceptsを使う」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- conceptsとSFINAEの比較
- requiresによるconceptsの定義
- テンプレートとautoでconceptsを使う
- 標準concepts:integralとRanges