0Pricing
C++ Academy · Aula

Por que conceitos em vez de SFINAE

Compare a legibilidade dos conceitos com as técnicas clássicas de SFINAE

Por que conceitos em vez de SFINAE é uma aula grátis de C++ Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C++ Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C++ Academy inclui 4 aulas no total.

A era do SFINAE

Antes do C++20, restringir modelos exigia SFINAE (Falha na substituição não é um erro). Funcionava, mas produzia erros enigmáticos e código extenso.

Um exemplo de SFINAE

Restringindo um modelo de função a tipos aritméticos — antes do C++20.

template <typename T,
          typename = std::enable_if_t<std::is_arithmetic_v<T>>>
T double_it(T x) {
    return x * 2;
}

O problema com SFINAE

Problemas:

  • Assinaturas de modelos difíceis de ler
  • Erros enigmáticos do compilador quando as restrições falham
  • É fácil cometer erros
  • Cada restrição adiciona código repetitivo

Conceitos: a solução limpa

Os conceitos do C++20 expressam restrições diretamente. Código mais limpo, mais legível e mensagens de erro muito melhores.

#include <concepts>

template <std::integral T>
T double_it(T x) {
    return x * 2;
}

Conceitos integrados

A biblioteca padrão fornece muitos conceitos em <concepts>:

  • std::integral
  • std::floating_point
  • std::same_as
  • std::convertible_to
  • std::invocable

Mensagens de erro aprimoradas

Quando um conceito falha, o compilador informa qual requisito não foi atendido. Com SFINAE, você recebia uma longa sequência de erros de substituição.

Conceitos como documentação

O nome de um conceito comunica a intenção: uma função restringida por std::integral informa aos leitores exatamente o que espera.

Sobrecarga de funções por conceito

Sobrecarregue funções com conceitos diferentes. A versão correspondente com mais restrições vence.

void f(std::integral auto x)        { /* integers */ }
void f(std::floating_point auto x)  { /* floats */ }

Subsunção de conceitos

O compilador entende quando um conceito é mais específico do que outro. std::integral engloba std::regular em alguns casos — a resolução de sobrecarga prefere o conceito mais específico.

Combinando com modelos

Os conceitos funcionam tanto com modelos de função quanto com modelos de classe.

template <std::movable T>
class Buffer { /* ... */ };

Modelos de função abreviados

Com conceitos, você pode usar parâmetros auto e impor restrições a eles diretamente.

void greet(std::convertible_to<std::string> auto name) {
    std::cout << "Hello, " << name;
}

Migração do SFINAE

Adote os conceitos gradualmente. Substitua um modelo restrito por SFINAE de cada vez. O compilador ajudará com erros mais claros.

Verificação rápida

Qual é a principal vantagem dos conceitos do C++20 em relação ao SFINAE?

Recapitulação

Os conceitos substituem SFINAE por uma forma mais limpa e declarativa de restringir modelos. Os conceitos padrão em <concepts> abrangem os casos comuns. Os erros apontam diretamente para o requisito que falhou.

Perguntas Frequentes

A aula “Por que conceitos em vez de SFINAE” é grátis?

Sim — o texto completo de “Por que conceitos em vez de SFINAE” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C++ Academy, atualize para CoddyKit PRO. O curso de C++ Academy inclui 4 aulas no total.

O que vou aprender em “Por que conceitos em vez de SFINAE”?

Compare a legibilidade dos conceitos com as técnicas clássicas de SFINAE Você pratica C++ Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar C++ Academy?

Nenhuma experiência prévia é necessária. C++ Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.

Quanto tempo leva a aula “Por que conceitos em vez de SFINAE”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de C++ Academy?

Sim. Cada aula de C++ Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Por que conceitos em vez de SFINAE
  2. Definir conceitos com requires
  3. Usar conceitos em modelos e auto
  4. Conceitos padrão comuns: integral e intervalos
← Voltar para C++ Academy