Sobes.tech
Junior — Middle

Jak można nałożyć ograniczenia na typy w parametrach szablonów w C++?

sobes.tech AI

Odpowiedź od AI

W C++ ograniczenia typów w parametrach szablonów można ustalić na kilka sposobów:

  1. SFINAE (Substitution Failure Is Not An Error) — za pomocą std::enable_if i innych meta-funkcji z <type_traits> można włączać lub wyłączać funkcje lub klasy szablonowe w zależności od właściwości typów.
#include <type_traits>

template<typename T, typename = std::enable_if_t<std::is_integral_v<T>>>
void foo(T value) {
    // Implementacja dla typów całkowitych
}

int main() {
    foo(10);    // OK, int jest typem całkowitym
    // foo(3.14); // Błąd kompilacji, double nie pasuje
}
  1. Koncepcy (Concepts) — od C++20 można używać koncepcji do bardziej czytelnych i deklaratywnych ograniczeń typów.
#include <concepts>

template<std::integral T>
void foo(T value) {
    // Implementacja dla typów całkowitych
}
  1. Statyczne asercje (static_assert) — wewnątrz szablonu można sprawdzić właściwości typu i zgłosić błąd kompilacji z komunikatem.
#include <type_traits>

template<typename T>
void foo(T value) {
    static_assert(std::is_integral_v<T>, "T musi być typem całkowitym");
    // ...
}

W ten sposób ograniczenia pomagają uczynić szablony bezpieczniejszymi i bardziej czytelnymi.