0Pricing
C++ Academy · レッスン

テンプレートと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フィードバックを取得できます。ローカル設定は不要です。

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

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