Saltar a contenido

Última actualización:2026-10-12

Deducción con auto en plantillas de C++17

En C++ todo puede ser auto

C++17 introdujo numerosas funciones pensadas para aumentar la expresividad del código y reducir la redundancia en las plantillas. Una de las mejoras más notables es la capacidad de declarar parámetros de plantilla no tipo con la palabra clave auto. En ciertos escenarios esta característica resulta especialmente cómoda, ya que elimina la necesidad de declarar tipos de forma explícita. A continuación contaré cómo uso esta característica en mi trabajo, es decir, en el ámbito de las bases de datos.

Se aprende desde la práctica: el código fuente completo de esta sección se subirá al Planeta; si te interesa, escanea el código QR al final de la página.

Parámetros de plantilla no tipo con auto en C++17

Ordenación en un escenario de base de datos

Considera una clase Foo relacionada con bases de datos que quieres ordenar según un orden concreto representado por una enumeración:

enum class SortOrder { Ascending, Descending };

Tienes instancias de Foo con distintos órdenes de clasificación:

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

La forma anterior de implementarlo

Antes de C++17, probablemente lo implementaríamos así:

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

Sin embargo, esto puede provocar errores, porque el compilador no puede deducir el parámetro de plantilla 'U'.

La forma simplificada actual

A partir de C++17, para los parámetros de plantilla no tipo podemos usar la palabra clave auto como sustituto:

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

Esta forma es más sencilla y nos permite usar parámetros de plantilla no tipo sin especificar el tipo explícitamente.

Simplificación de integral_constant

Antes podríamos implementar integral_constant de la siguiente manera:

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

Y ahora basta con:

template <auto __v>
struct integral_constant {}

Esta simplificación hace que el código sea más claro y legible.

Conclusión

El uso de la palabra clave auto introducido en C++17 para declarar parámetros de plantilla no tipo simplifica enormemente el código de plantillas. Al eliminar las tediosas declaraciones de tipos, podemos expresar la intención del código de forma más intuitiva y mejorar su legibilidad y mantenibilidad. En escenarios como la ordenación, esta característica resulta especialmente útil: nos permite concentrarnos en la esencia del problema y no en los detalles de los parámetros de plantilla.

Temas relacionados

Comentarios