Стандартная функция std function
std::function в C++ представляет собой универсальную обертку над функциями и лямбда-выражениями, позволяющую хранить функциональные объекты разных типов и вызывать их с различными сигнатурами. Она является частью библиотеки STL и введена в стандарте C++11.
Одной из основных целей использования std::function является создание функциональных объектов, которые можно передавать другим функциям в качестве аргументов или хранить в контейнерах, таких как векторы или списки.
Прежде чем перейти к примерам кода, рассмотрим основные аспекты использования std::function.
- Объявление
std::function:
<pre><code class="cpp">std::function<void(int)> func;
</code></pre>
- Присваивание функции или лямбда-выражения:
<pre><code class="cpp">void printNumber(int num) {
std::cout << "Number: " << num << std::endl;
}
auto lambda = [](int num) {
std::cout << "Lambda: " << num << std::endl;
};
func = printNumber; // Присваиваем функцию
func(42); // Вызываем функцию
func = lambda; // Присваиваем лямбда-выражение
func(42); // Вызываем лямбда-выражение
</code></pre>
- Возвращаемая функция:
<pre><code class="cpp">std::function<int()> getIncrementFunction(int incrementBy) {
return [incrementBy]() mutable {
static int counter = 0;
counter += incrementBy;
return counter;
};
}
auto incrementFunction = getIncrementFunction(5);
std::cout << incrementFunction() << std::endl; // Выведет 5
std::cout << incrementFunction() << std::endl; // Выведет 10
std::cout << incrementFunction() << std::endl; // Выведет 15
</code></pre>
- Проверка на пустую функцию:
<pre><code class="cpp">std::function<void(int)> func;
if (func.empty()) {
std::cout << "Empty function" << std::endl;
}
</code></pre>
- Сравнение
std::function:
<pre><code class="cpp">std::function<void(int)> func1 = printNumber;
std::function<void(int)> func2 = printNumber;
if (func1 == func2) {
std::cout << "Equal" << std::endl;
} else {
std::cout << "Not equal" << std::endl;
}
</code></pre>
- Условное выполнение
std::function:
<pre><code class="cpp">bool condition = true;
std::function<void(int)> func = (condition) ? printNumber : lambda;
func(42); // Вызовет либо printNumber, либо lambda в зависимости от значения condition
</code></pre>
- Пример использования
std::functionс алгоритмами STL:
<pre><code class="cpp">std::vector<int> numbers = {1, 2, 3, 4, 5};
std::function<bool(int)> isEven = [](int num) {
return num % 2 == 0;
};
auto evenNumbers = std::count_if(numbers.begin(), numbers.end(), isEven);
std::cout << "Even numbers count: " << evenNumbers << std::endl;
</code></pre>
В заключение, std::function предоставляет удобный способ хранения и вызова различных функциональных объектов в C++. Она позволяет работать с функциями и лямбда-выражениями разных типов и сигнатур и открывает возможности для создания гибкого кода с использованием функционального программирования.