Junior — Middle
Как могат да се зададат ограничения за типовете в шаблонните параметри в C++?
sobes.tech AI
Отговор от AI
В C++ ограниченията върху типовете в шаблонните параметри могат да бъдат зададени по няколко начина:
- 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 не е подходящ
}
- Концепти (Concepts) — от C++20 нататък, могат да се използват концепти за по-четливи и декларативни ограничения на типовете.
#include <concepts>
template<std::integral T>
void foo(T value) {
// Реализация за цели типове
}
- Статични твърдения (
static_assert) — вътре в шаблона може да се проверят свойствата на типа и да се генерира грешка при компилация с съобщение.
#include <type_traits>
template<typename T>
void foo(T value) {
static_assert(std::is_integral_v<T>, "T трябва да бъде цял тип");
// ...
}
По този начин ограниченията помагат да се направят шаблоните по-безопасни и по-лесни за разбиране.