Ir para o conteúdo

Última atualização:2026-10-12

Dedução com auto em templates no C++17

Em C++, tudo pode ser auto

O C++17 introduziu muitos recursos destinados a aumentar a expressividade do código e a reduzir a verbosidade dos templates. Um dos aprimoramentos mais notáveis é a capacidade de usar a palavra-chave auto para declarar parâmetros de template não tipo. Em certos cenários, esse recurso é especialmente conveniente, pois elimina a necessidade de declarações explícitas de tipo. A seguir, vou apresentar como uso esse recurso no meu trabalho, ou seja, em bancos de dados!

Aprendendo na prática: o código-fonte completo desta seção será enviado ao Planeta; se tiver interesse, veja o QR code no fim da página.

Parâmetros de template não tipo com auto no C++17

Ordenação no contexto de bancos de dados

Considere uma classe Foo relacionada a bancos de dados, que você deseja ordenar de acordo com uma ordem específica representada por uma enumeração:

enum class SortOrder { Ascending, Descending };

Você tem instâncias de Foo com ordens de classificação diferentes:

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

A forma antiga de implementar

Antes do C++17, poderíamos implementar assim:

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

Contudo, isso poderia causar erros, porque o compilador não consegue inferir o argumento de template 'U'.

A forma simplificada atualmente

A partir do C++17, para parâmetros de template não tipo, podemos usar a palavra-chave auto como substituto:

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

Essa forma é mais simples, permitindo usar parâmetros de template não tipo sem especificar o tipo explicitamente.

Simplificação do integral_constant

Antes, poderíamos implementar integral_constant da seguinte forma:

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

E agora basta:

template <auto __v>
struct integral_constant {}

Essa simplificação torna o código mais claro e legível.

Conclusão

O uso da palavra-chave auto introduzido no C++17 para declarar parâmetros de template não tipo simplifica enormemente o código de templates. Ao eliminar declarações de tipo trabalhosas, conseguimos expressar a intenção do código de forma mais intuitiva, melhorando a legibilidade e a manutenibilidade. Ao lidar com cenários como ordenação, esse recurso é particularmente útil, permitindo-nos focar na essência do problema, e não nos detalhes dos parâmetros de template.

Tópicos relacionados

Comentários