Sobes.tech
Junior — Middle

Como é que se podem impor restrições aos tipos nos parâmetros de template em C++?

sobes.tech IA

Resposta da IA

No C++, as restrições nos tipos nos parâmetros de modelos podem ser definidas de várias maneiras:

  1. SFINAE (Substitution Failure Is Not An Error) — usando std::enable_if e outras meta-funções de <type_traits>, pode-se incluir ou excluir funções ou classes de modelos dependendo das propriedades dos tipos.
#include <type_traits>

template<typename T, typename = std::enable_if_t<std::is_integral_v<T>>>
void foo(T value) {
    // Implementação para tipos inteiros
}

int main() {
    foo(10);    // OK, int é inteiro
    // foo(3.14); // Erro de compilação, double não é adequado
}
  1. Conceitos — a partir do C++20, pode-se usar conceitos para restrições de tipos mais legíveis e declarativas.
#include <concepts>

template<std::integral T>
void foo(T value) {
    // Implementação para tipos inteiros
}
  1. Afirmações estáticas (static_assert) — dentro de um modelo, pode-se verificar as propriedades do tipo e gerar um erro de compilação com uma mensagem.
#include <type_traits>

template<typename T>
void foo(T value) {
    static_assert(std::is_integral_v<T>, "T deve ser um tipo inteiro");
    // ...
}

Assim, as restrições ajudam a tornar os modelos mais seguros e compreensíveis.