Перейти к содержанию

Последнее обновление:2026-10-12

Выведение auto в шаблонах C++17

В C++ auto подходит для всего

В C++17 появилось множество возможностей, направленных на повышение выразительности кода и сокращение избыточности шаблонного кода. Одним из заметных улучшений стала возможность объявлять нетиповые шаблонные параметры с помощью ключевого слова auto. В некоторых сценариях эта возможность особенно удобна, так как устраняет необходимость в явном объявлении типа. Далее я покажу, как я использую эту возможность в своей работе, а именно в базе данных!

Учимся на практике: полный исходный код этого раздела будет выложен в сообществе (知识星球), заинтересованные — отсканируйте QR-код в конце страницы.

Нетиповые шаблонные параметры с auto в C++17

Сортировка в сценарии базы данных

Рассмотрим связанный с базой данных класс 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 {}

Такое упрощение делает код более ясным и читабельным.

Вывод

Возможность использовать ключевое слово auto, появившуюся в C++17, для объявления нетиповых шаблонных параметров значительно упростила шаблонный код. Устраняя громоздкие объявления типов, мы можем более наглядно выражать намерение кода, повышая его читабельность и сопровождаемость. При работе со сценариями вроде сортировки эта возможность особенно полезна, позволяя сосредоточиться на сути задачи, а не на деталях шаблонных параметров.

Похожие темы

Комментарии