Обобщенные лямбда-выражения в C ++ 14
Лямбда-выражения были введены в C ++ 11. По сути, они представляют собой фрагменты кода, которые могут быть вложены в другие функции и даже операторы вызова функций. Комбинируя лямбда-выражение с ключевым словом auto, эти выражения можно впоследствии использовать в программе.
Мы подробно обсудили лямбда-выражения в этой статье «Лямбда-выражения в C ++». Прежде чем продолжить работу с этой статьей, убедитесь, что вы прочитали статью по ссылке или знаете о семантике лямбда-выражения, такой как захват области действия, возвращаемое значение.
В C ++ 14 лямбда-выражения были усовершенствованы, введя так называемое обобщенное лямбда-выражение. Чтобы понять эту особенность, давайте рассмотрим общий пример. Предположим, мы создали лямбда-функцию для возврата суммы двух целых чисел. Итак, наша лямбда-функция будет выглядеть так:
[] (int a, int b) -> int {return a + b; }
Но что, если нам позже понадобится получить сумму двух значений с плавающей запятой. Поэтому нам нужно будет объявить другое лямбда-выражение, которое будет работать только для значений типа double. Точно так же каждый раз, когда наши входные параметры меняли тип, лямбда-функцию приходилось переписывать.
[] (двойная а, двойная б) -> двойная {верните а + б; }
До C ++ 14 был способ обойти эту проблему, используя параметры шаблона,
template<typename T> [](T a, T b) -> T { return a + b };
C ++ 14 избавляется от этого и позволяет нам использовать ключевое слово auto во входных параметрах лямбда-выражения. Таким образом, компиляторы теперь могут определять тип параметров во время компиляции. Итак, в нашем предыдущем примере лямбда-выражение, которое будет работать как для целых чисел, так и для значений с плавающей запятой, будет выглядеть следующим образом:
[] (auto a, auto b) {вернуть a + b; }
Очень важным применением этой функции является то, что она значительно улучшает существующие алгоритмы. Возьмем, к примеру, функцию sort (). Следующий фрагмент отсортирует все типы данных (при условии, что они имеют перегруженные операторы <) в порядке убывания.
sort (container.begin (), container.end (), [] (auto i, auto j) -> bool {return i> j; }
Вот несколько примеров программ, использующих обобщенные лямбды:
Пример 1
// Cpp program to demonstrate // generalized lambda expressions #include <iostream> #include <string> using namespace std; int main() { // Declare a generalized lambda and store it in sum auto sum = []( auto a, auto b) { return a + b; }; // Find sum of two integers cout << sum(1, 6) << endl; // Find sum of two floating numbers cout << sum(1.0, 5.6) << endl; // Find sum of two strings cout << sum(string( "Geeks" ), string( "ForGeeks" )) << endl; return 0; } |
Выход:
7 6,6 GeeksForGeeks
Пример 2:
// Cpp program to demonstrate // how to sort integers, floats, strings // floating data types using a // generalized lambda and sort function #include <algorithm> #include <iostream> #include <string> #include <vector> using namespace std; // Utility Function to print the elements of a collection void printElements( auto & C) { for ( auto e : C) cout << e << " " ; cout << endl; } int main() { // Declare a generalized lambda and store it in greater auto greater = []( auto a, auto b) -> bool { return a > b; }; // Initialize a vector of integers vector< int > vi = { 1, 4, 2, 1, 6, 62, 636 }; // Initialize a vector of doubles vector< double > vd = { 4.62, 161.3, 62.26, 13.4, 235.5 }; // Initialize a vector of strings vector<string> vs = { "Tom" , "Harry" , "Ram" , "Shyam" }; // Sort integers sort(vi.begin(), vi.end(), greater); // Sort doubles sort(vd.begin(), vd.end(), greater); // Sort strings sort(vs.begin(), vs.end(), greater); printElements(vi); printElements(vd); printElements(vs); return 0; } |
Выход:
636 62 6 4 2 1 1 235,5 161,3 62,26 13,4 4,62 Том Шиам Рам Гарри
Примечание. Обобщенные лямбда-выражения работают только для стандартов C ++ 14 и более поздних версий. Список компиляторов, поддерживающих C ++ 14, приведен в разделе справочной информации.
Использованная литература:
- https://isocpp.org/wiki/faq/cpp14-language
- http://en.cppreference.com/w/cpp/compiler_support