Sobes.tech
Junior — Middle

Как могат да се зададат ограничения за типовете в шаблонните параметри в C++?

sobes.tech AI

Отговор от AI

В C++ ограниченията върху типовете в шаблонните параметри могат да бъдат зададени по няколко начина:

  1. SFINAE (Substitution Failure Is Not An Error) — с помощта на std::enable_if и други мета-функции от <type_traits>, може да се включват или изключват шаблонни функции или класове в зависимост от свойствата на типовете.
#include <type_traits>

template<typename T, typename = std::enable_if_t<std::is_integral_v<T>>>
void foo(T value) {
    // Реализация за цели типове
}

int main() {
    foo(10);    // OK, int е цял тип
    // foo(3.14); // Грешка при компилация, double не е подходящ
}
  1. Концепти (Concepts) — от C++20 нататък, могат да се използват концепти за по-четливи и декларативни ограничения на типовете.
#include <concepts>

template<std::integral T>
void foo(T value) {
    // Реализация за цели типове
}
  1. Статични твърдения (static_assert) — вътре в шаблона може да се проверят свойствата на типа и да се генерира грешка при компилация с съобщение.
#include <type_traits>

template<typename T>
void foo(T value) {
    static_assert(std::is_integral_v<T>, "T трябва да бъде цял тип");
    // ...
}

По този начин ограниченията помагат да се направят шаблоните по-безопасни и по-лесни за разбиране.