Функциональный (C ++) - Functional (C++)
Стандартная библиотека C ++ |
---|
Контейнеры |
Стандартная библиотека C |
Эта статья может требовать уборка встретиться с Википедией стандарты качества.Декабрь 2010 г.) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
В контексте языка программирования C ++, функциональный
относится к заголовочный файл это часть Стандартная библиотека C ++ и предоставляет набор предопределенных шаблоны классов для функциональные объекты, включая операции для арифметики, сравнения и логики. Экземпляры этих шаблонов классов: Классы C ++ которые определяют оператор вызова функции, а экземпляры этих классов можно назвать, как если бы они были функции.[1] Можно выполнять очень сложные операции без написания нового функционального объекта, просто комбинируя предопределенные функциональные объекты и адаптеры функциональных объектов.
Шаблон класса std :: function
предоставленный C ++ 11 универсальный полиморфный оболочка функции. Экземпляры std :: function
может хранить, копировать и вызывать любую вызываемую цель - функции, лямбда-выражения (выражения, определяющие анонимные функции ), связать выражения (экземпляры адаптеров функций, которые преобразуют функции в другие функции меньшего размера. арность путем предоставления значений для некоторых аргументов) или других функциональных объектов.
В алгоритмы предоставляемые стандартной библиотекой C ++, не требуют функциональных объектов с более чем двумя аргументами. Функциональные объекты, возвращающие Булево ценности - важный частный случай. А унарная функция чей возвращаемый тип bool
называется предикат, и двоичная функция, возвращаемый тип которой bool
называется бинарный предикат.
Адаптируемые функциональные объекты
В общем, объект функции имеет ограничения на тип аргумента. Однако ограничения типа не должны быть простыми: оператор()
может быть перегружен или может быть шаблоном члена. Точно так же у программы не должно быть возможности определить, каковы эти ограничения. Адаптируемый функциональный объект, однако, определяет типы аргументов и возвращаемых значений и предоставляет вложенные typedef
s чтобы эти типы можно было назвать и использовать в программах. Если тип F0
модель адаптируемого генератора, то она должна определять F0::result_type
. Аналогично, если F1
модель адаптируемой унарной функции, она должна определять F1::аргумент_тип
и F1::result_type
, и если F2
модель адаптируемой бинарной функции, она должна определять F2::first_argument_type
, F2::второй_аргумент_типа
, и F2::result_type
. Стандартная библиотека C ++ предоставляет базовые классы unary_function
и двоичная_функция
для упрощения определения адаптируемых унарных функций и адаптируемых бинарных функций.
Адаптируемые функциональные объекты важны, потому что они могут использоваться адаптерами функциональных объектов: функциональными объектами, которые трансформируют или манипулируют другими функциональными объектами. Стандартная библиотека C ++ предоставляет множество различных адаптеров функциональных объектов, включая unary_negate
(который возвращает логическое дополнение значения, возвращаемого конкретным адаптируемым предикатом), и unary_compose
и binary_compose
, которые выполняют композицию объекта функции.
Предопределенные функциональные объекты
Стандартная библиотека C ++ входит в заголовочный файл функциональный
множество различных предопределенных функциональных объектов, включая арифметические операции (плюс
, минус
, умножается
, разделяет
, модуль
, и отрицать
), сравнения (равно
, not_equal_to
, больше
, Меньше
, больше_равно
, и less_equal
) и логические операции (логическое_и
, логический_или
, и логическое_не
).[1]
Примеры
Обертки функций могут использоваться для выполнения вызовов обычных функций или объектов функций, созданных лямбда-выражениями.
#включают <iostream>#включают <functional>/ * Определяем шаблонную функцию * /шаблон <typename Т>пустота PrintValue(Т ценность) { стандартное::cout << ценность << стандартное::конец;}int основной(пустота) { / * Обертка функции для функции * / стандартное::функция<пустота(int)> func_a = PrintValue<int>; func_a(2015); / * Обертка функции для указателя функции * / стандартное::функция<пустота(int)> func_b = &PrintValue<int>; func_b(2016); / * Функция-оболочка лямбда-функции. * / стандартное::функция<пустота(int)> func_c = [](int ценность) { стандартное::cout << ценность << стандартное::конец; }; func_c(2017); / * Обертка функции, созданная std :: bind (). * Передайте предварительно определенный параметр при привязке. */ стандартное::функция<пустота(пустота)> func_d = стандартное::связывать(PrintValue<стандартное::строка>, "Пи есть"); func_d(); / * Обертка функции, созданная std :: bind (). * Передайте параметр при вызове функции. */ стандартное::функция<пустота(плавать)> func_e = стандартное::связывать(PrintValue<плавать>, стандартное::заполнители::_1); func_e(3.14159);}
Обертки функций также могут использоваться для доступа к переменным-членам и функциям-членам классов.
#включают <iostream>#включают <functional>шаблон <typename Т>класс CAnyData { общественный: CAnyData(Т ценность) : m_value{ценность} {} пустота Распечатать(пустота) { стандартное::cout << m_value << стандартное::конец; } пустота PrintAfterAdd(Т ценность) { стандартное::cout << (m_value + ценность) << стандартное::конец; } Т m_value;};int основной() { / * Обертка функции для переменной-члена класса * / CAnyData<int> data_a{2016}; стандартное::функция<int(CAnyData<int> &)> func_a = &CAnyData<int>::m_value; стандартное::cout << func_a(data_a) << стандартное::конец; / * Обертка функции для функции-члена без передачи параметров * / CAnyData<плавать> data_b{2016.1}; стандартное::функция<пустота(CAnyData<плавать> &)> func_b = &CAnyData<плавать>::Распечатать; func_b(data_b); / * Обертка функции для функции-члена с передачей параметра * / стандартное::функция<пустота(CAnyData<плавать> &, плавать)> func_c = &CAnyData<плавать>::PrintAfterAdd; func_c(data_b, 0.1); / * Функция-оболочка для функции-члена, сгенерированной std :: bind * / стандартное::функция<пустота(плавать)> func_d = стандартное::связывать(&CAnyData<плавать>::PrintAfterAdd, &data_b, стандартное::заполнители::_1); func_d(0.2);}
использованная литература
- ^ а б Йосуттис, Николай М. (1999). Стандартная библиотека C ++. Эддисон-Уэсли. ISBN 978-0-201-37926-6.