コンテンツにスキップ

最終更新:2026-10-12

C++17 テンプレート auto 推論

C++はすべてautoに

C++17は、コードの表現力を高め、テンプレートコードの冗長性を減らすことを目指した多くの機能を導入しました。その中でも顕著な強化の1つが、autoキーワードで非型テンプレートパラメータを宣言できるようになったことです。この機能は、明示的な型宣言の必要性をなくすため、場面によっては特に便利です。以下では、私の仕事、すなわちデータベースの中でこの機能をどのように使っているかを紹介します!

実践から学びましょう。本節の完全なソースコードは星球にアップロードされます。興味があれば末尾のQRコードをご覧ください。

C++17でのautoによる非型テンプレートパラメータ

データベースの場面でのソート

データベースに関連するクラスFooを考えてみます。列挙型で表される特定の順序に従ってソートしたいとします:

enum class SortOrder { Ascending, Descending };

異なるソート順を持つFooのインスタンスを持ちます:

Foo<SortOrder::Ascending> f1;
Foo<SortOrder::Descending> f2;

以前の実装方法

C++17より前では、おそらくこのように実装していました:

template <typename U, template <U> class T, U K>
auto GetSortOrder(const T<K>&) {
  return K;
}

しかし、コンパイラがテンプレートパラメータ'U'を推論できないため、これはエラーになる可能性があります。

現在の簡潔な方法

C++17以降では、非型テンプレートパラメータに対してautoキーワードを使って置き換えられます:

template <template <auto> class T, auto K>
auto GetSortOrder(const T<K>&) {
  return K;
}

この方法はより簡単で、型を明示的に指定せずに非型テンプレートパラメータを使えます。

integral_constantの簡潔化

以前は、次のような方法でintegral_constantを実装していたかもしれません:

template <typename _Tp, _Tp __v>
struct integral_constant {}

今はこれだけで済みます:

template <auto __v>
struct integral_constant {}

この簡潔化により、コードはより明快で読みやすくなります。

結論

C++17で導入された、非型テンプレートパラメータの宣言にautoキーワードを使う機能は、テンプレートコードを大幅に簡潔にしました。煩わしい型宣言をなくすことで、コードの意図をより直感的に表現でき、可読性と保守性が向上します。ソートなどの処理ではこの機能が特に役立ち、テンプレートパラメータの細部ではなく問題の本質に集中できるようになります。

関連トピック

コメント