0Pricing
C++ Academy · レッスン

conceptsとSFINAEの比較

conceptsと従来のSFINAE手法の可読性を比較します。

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

SFINAEの時代

C++20より前は、テンプレートに制約を付けるためにSFINAE(Substitution Failure Is Not An Error)が必要でした。機能はしましたが、不可解なエラーや冗長なコードが生じていました。

SFINAEの例

関数テンプレートを算術型に制限する方法です(C++20より前の形式)。

template <typename T,
          typename = std::enable_if_t<std::is_arithmetic_v<T>>>
T double_it(T x) {
    return x * 2;
}

SFINAEの問題点

問題点:

  • 読みにくいテンプレートシグネチャ
  • 制約に違反したときの不可解なコンパイラーエラー
  • 間違いやすい
  • 制約を追加するたびに定型コードが増える

コンセプト:すっきりした解決策

C++20のコンセプトでは、制約を直接表現できます。コードがすっきりして読みやすくなり、エラーメッセージも大幅に改善されます。

#include <concepts>

template <std::integral T>
T double_it(T x) {
    return x * 2;
}

組み込みコンセプト

標準ライブラリは<concepts>に多くのコンセプトを提供しています:

  • std::integral
  • std::floating_point
  • std::same_as
  • std::convertible_to
  • std::invocable

改善されたエラーメッセージ

コンセプトを満たさない場合、コンパイラーはどの要件を満たせなかったかを報告します。SFINAEでは、置換エラーが大量に表示されていました。

ドキュメントとしてのコンセプト

コンセプト名は意図を伝えます。std::integralで制約された関数を見れば、その関数が何を期待しているのかを正確に把握できます。

コンセプトによる関数オーバーロード

異なるコンセプトに基づいて関数をオーバーロードできます。条件に一致する中で最も制約の厳しいバージョンが選択されます。

void f(std::integral auto x)        { /* integers */ }
void f(std::floating_point auto x)  { /* floats */ }

コンセプトの包含関係

コンパイラーは、あるコンセプトが別のコンセプトより具体的であることを理解します。場合によってはstd::integralがstd::regularを包含し、オーバーロード解決ではより具体的なものが優先されます。

テンプレートとの組み合わせ

コンセプトは関数テンプレートとクラステンプレートの両方で使用できます。

template <std::movable T>
class Buffer { /* ... */ };

省略形式の関数テンプレート

コンセプトを使うと、autoパラメーターを使用し、インラインで制約を付けられます。

void greet(std::convertible_to<std::string> auto name) {
    std::cout << "Hello, " << name;
}

SFINAEからの移行

コンセプトは段階的に導入できます。SFINAEで制約されたテンプレートを一度に1つずつ置き換えてください。コンパイラーが、より明確なエラーでサポートしてくれます。

クイックチェック

C++20のコンセプトがSFINAEより優れている主な点は何ですか。

まとめ

コンセプトは、テンプレートに制約を付けるための、よりすっきりした宣言的な方法でSFINAEを置き換えます。<concepts>の標準コンセプトは、一般的なケースをカバーしています。エラーは、満たせなかった要件を直接示します。

よくある質問

「conceptsとSFINAEの比較」レッスンは無料ですか?

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

「conceptsとSFINAEの比較」で何を学びますか?

conceptsと従来のSFINAE手法の可読性を比較します。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「conceptsとSFINAEの比較」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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