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:
- SFINAE (Substitution Failure Is Not An Error) — usando
std::enable_ife 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
}
- 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
}
- 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.