勝者:テンプレート

C++ の未来はテンプレートを語り、私のブログ Modernes C++ もそうです。私の最後の投稿「Quo Vadis - Modernes C++」の投票に基づいて、次のおそらく 50 ~ 100 の投稿でテンプレートの詳細を説明します。この投稿では、今後の投稿のアイデアをお伝えしたいと思います.

その結果は 2 つの点で私を驚かせたので、最初に世論調査について少し書かせてください。

世論調査

まず、約 400 人が投票に参加しました。これは私が予想していなかった数字です。たくさんの投票ありがとうございます。

次に、「C++23」がおそらく投票に勝ち、次に「テンプレート」または「C/C++ による Python の拡張と埋め込み」が続くと思いました。私の仮定はとても間違っていました。投票できてよかったです。

この「テンプレート」が完成したら、次の投票を行います。では、ホイールをテンプレートに引き裂いてみましょう。

テンプレート

まず第一に:テンプレートとは何ですか?テンプレート (クラス テンプレートまたは関数テンプレート) は、クラスまたは関数のファミリです。

私の計画を提示する前に、あなたが興味を持っているテンプレート関連の機能を忘れた場合は、私に電子メールを書いてください.表示するには JavaScript を有効にする必要があります..

これらは、いくつかの追加の単語を含む今後のトピックです:

基本

もちろん、私のツアーは基本から始まります。

  • 関数テンプレートのインスタンス化の提示 テンプレートに関する最初の直感を提供します。これは特に、関数のオーバーロードまたは明示的なテンプレート引数が指定された場合に当てはまります。
  • 関数テンプレートとは対照的に、クラス テンプレートのテンプレート引数を推測できるのは C++17 コンパイラのみです。 .つまり、C++17 より前では、int などのテンプレート引数を指定する必要があります。 std::vector<int> で .
  • テンプレート パラメータ タイプ、非タイプ、およびテンプレートにすることができます。特に、浮動小数点値は C++20 で非型テンプレート パラメータとして使用できます。
  • コンパイラはテンプレート引数を自動的に推測できます テンプレートの。テンプレート パラメーターが参照/ポインター、ユニバーサル参照 (&&)、または値である場合、大きな違いが生じます。テンプレートは、デフォルトのテンプレート引数を持つこともできます.
  • クラス テンプレートにより、部分的および完全なテンプレートの特殊化が可能 、関数テンプレートのみの完全なテンプレートの特殊化。

詳細

基本を説明した後、詳細を説明したいと思います。

  • 一般的に、テンプレートのインスタンス化 on は暗黙的に行われますが、明示的に行うこともできます。
  • バリアディック テンプレート 任意の数のパラメーターを持つことができるテンプレートです。したがって、テンプレートは任意の値カテゴリの任意の数の引数を取ることができます。
  • C++11 の可変個引数テンプレートに基づいて、折り畳み式を取得しました C++17 で。フォールド式は、二項演算子のパラメーター パックを減らします。
  • 友情 のテンプレートは特別です。クラスまたはクラス テンプレートは、クラス テンプレートまたは関数テンプレートの各インスタンスに一般的な友情を与えることができます。フレンドシップは、クラス テンプレートまたは関数テンプレートの特定のインスタンス、および特定の型にも付与できます。
  • 名前は、テンプレート パラメータに依存する場合があります。 従属名の場合 、名前が型、非型、またはテンプレートであるかどうかをコンパイラが判断できるようにする必要があります。あいまいな場合、コンパイラは名前が非型であると想定します。

テクニック

テンプレートとテンプレートのインスタンス化に関連する多くの手法と機能があります。

  • 少なくとも 2 つのテンプレート パラメーターを含む関数テンプレートを使用する場合、一般に、関数テンプレートの戻り値の型を決定することはできません。ここでは、自動返品タイプ eは私たちの救助に来ます。
  • テンプレートのメタプログラミング チューリング完了です。これは、計算可能なものはすべてコンパイル時に計算できることを意味します。テンプレート メタプログラミングは、命令型言語 C++ に組み込まれた純粋な関数型言語です。多くのブースト ライブラリなどのライブラリは、テンプレート メタプログラミングを多用しています。
  • タイプの特徴 ライブラリは、テンプレート メタプログラミングが適用されます。型特性ライブラリのおかげで、コンパイル時に型チェック、型比較、型変更を実行できます。
  • constexpr コンパイル時にプログラムする便利な方法です。テンプレート メタプログラミングを使用した関数型プログラミングとは対照的に、constexpr でプログラミングできます。 命令的なスタイルで。
  • constexpr if ソース コードを条件付きでコンパイルできるようにします。

デザイン

テンプレートは C++ を開き、ソフトウェアを設計する新しい方法を提供します。

  • 動的ポリモーフィズムのほかに (オブジェクト指向)、静的ポリモーフィズムがあります (テンプレート).
  • CRTP (奇妙に繰り返されるテンプレート パターン) は驚くべきものですが、非常に強力な手法です。 CRTP のおかげで、仮想性を実行時からコンパイル時に移行できます。
  • 表現テンプレート 計算を表す構造を作成します。それらは必要で余裕のあるときにのみ評価されるため、時間とメモリが節約されます。
  • 多くのイディオムとパターンがあります テンプレート関連。たとえば、ポリシーと特性、タグ ディスパッチ、型消去があります。

C++20

  • コンセプト C++ プログラミング言語によって提供されるテンプレート機能の拡張です。概念は、コンパイル時に評価される、テンプレート パラメーターのブール述語と呼ばれます。概念はテンプレート (クラス テンプレート、関数テンプレート、またはクラス テンプレートのメンバー関数) に関連付けることができ、その場合は 制約 として機能します。 :テンプレート パラメーターとして受け入れられる引数のセットを制限します。(ウィキペディア)

次は?

次回の投稿では、オンライン コンパイラ C++ Insights を使用した関数テンプレートを紹介します。