Sobes.tech
Junior — Middle

Come si possono impostare restrizioni sui tipi nei parametri di template in C++?

sobes.tech AI

Risposta dell'AI

In C++, le restrizioni sui tipi nei parametri di template possono essere definite in diversi modi:

  1. SFINAE (Substitution Failure Is Not An Error) — usando std::enable_if e altre meta-funzioni di <type_traits>, si possono includere o escludere funzioni o classi template in base alle proprietà dei tipi.
#include <type_traits>

template<typename T, typename = std::enable_if_t<std::is_integral_v<T>>>
void foo(T value) {
    // Implementazione per tipi interi
}

int main() {
    foo(10);    // OK, int è intero
    // foo(3.14); // Errore di compilazione, double non adatto
}
  1. Concetti (Concepts) — a partire da C++20, si possono usare i concetti per restrizioni di tipi più leggibili e dichiarative.
#include <concepts>

template<std::integral T>
void foo(T value) {
    // Implementazione per tipi interi
}
  1. Asserzioni statiche (static_assert) — all’interno di un template, si può verificare le proprietà del tipo e generare un errore di compilazione con un messaggio.
#include <type_traits>

template<typename T>
void foo(T value) {
    static_assert(std::is_integral_v<T>, "T deve essere un tipo intero");
    // ...
}

In questo modo, le restrizioni aiutano a rendere i template più sicuri e comprensibili.