РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
716 of 815 menu

Ограничение шаблона

Ограничение шаблона (constraint) - это механизм C++20, позволяющий накладывать требования на параметры шаблона. Если ограничение не выполняется, шаблон не участвует в разрешении перегрузки. Ограничения задаются с помощью концептов (concept) или выражений requires. В первом параметре указывается ограничение, а во втором - параметры шаблона, к которым оно применяется.

Синтаксис

template <typename T> requires Constraint<T> void func(T value); // или короче: template <Constraint T> void func(T value);

Пример

Давайте создадим концепт Integral, который требует, чтобы тип был целочисленным, и ограничим им шаблонную функцию:

#include <iostream> #include <concepts> using namespace std; template <typename T> concept Integral = is_integral_v<T>; template <Integral T> T add(T a, T b) { return a + b; } int main() { cout << add(2, 3) << endl; return 0; }

Результат выполнения кода:

5

Пример

Давайте попробуем передать в функцию add значение типа double и убедимся, что ограничение запрещает вызов:

#include <iostream> #include <concepts> using namespace std; template <typename T> concept Integral = is_integral_v<T>; template <Integral T> T add(T a, T b) { return a + b; } int main() { // add(2.5, 3.5); // ошибка компиляции cout << add(10, 20) << endl; return 0; }

Результат выполнения кода:

30

Пример

Давайте используем выражение requires напрямую для ограничения шаблона, требующего наличия метода size:

#include <iostream> #include <string> #include <vector> using namespace std; template <typename T> requires requires(T t) { t.size(); } void printSize(const T& value) { cout << value.size() << endl; } int main() { string str = "abcde"; vector<int> vec = {1, 2, 3, 4, 5}; printSize(str); printSize(vec); return 0; }

Результат выполнения кода:

5 5

Смотрите также

  • ключевое слово concept,
    которое объявляет именованное ограничение
  • ключевое слово requires,
    которое задает требование к шаблону
  • выражение requires-expression,
    которое проверяет корректность выражений
  • тип constraint,
    который представляет собой ограничение шаблона
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить