Sobes.tech
Junior — Middle

Cum se pot impune restricții asupra tipurilor în parametrii de șablon în C++?

sobes.tech AI

Răspuns de la AI

În C++, restricțiile asupra tipurilor în parametrii de șablon pot fi stabilite în mai multe moduri:

  1. SFINAE (Substitution Failure Is Not An Error) — folosind std::enable_if și alte meta-funcții din <type_traits>, se pot include sau exclude funcții sau clase șablon în funcție de proprietățile tipurilor.
#include <type_traits>

template<typename T, typename = std::enable_if_t<std::is_integral_v<T>>>
void foo(T value) {
    // Implementare pentru tipuri întregi
}

int main() {
    foo(10);    // OK, int este întreg
    // foo(3.14); // Eroare de compilare, double nu se potrivește
}
  1. Concepte (Concepts) — începând cu C++20, se pot folosi concepte pentru restricții mai lizibile și declarative ale tipurilor.
#include <concepts>

template<std::integral T>
void foo(T value) {
    // Implementare pentru tipuri întregi
}
  1. Afirmări statice (static_assert) — în interiorul unui șablon, se pot verifica proprietățile tipului și se poate genera o eroare de compilare cu un mesaj.
#include <type_traits>

template<typename T>
void foo(T value) {
    static_assert(std::is_integral_v<T>, "T trebuie să fie un tip întreg");
    // ...
}

Astfel, restricțiile ajută la crearea unor șabloane mai sigure și mai ușor de înțeles.