Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
curry. Мы от них избавились благодаря typedef'ам, которые при помощи того же Variadic Templates генерировать не получится из-за их именования (first_argument_type, second_argument_type, etc).cout << foo("Кока-кола", 2, 9.95) << endl; // => Кока-кола: 2 л. = 9.95$
cout << mega::curry(foo)("Кока-кола")(2)(9.95) << endl; // => Кока-кола: 2 л. = 9.95$
string foo(string s, int i, double d);
auto fooCola = [](int i, double d) { return foo("Coca-cola", i, d); };
auto fooCola2Litra = [&](double d) { return fooCola(2, d); };
fooCola2Litra(9.95);
Функцияmap— это аналогstd::for_each, т.е. она принимает какую-то функцию и вызывает её для каждого элемента списка.
map, помимо всего, возвращает результат применения. Я думаю в этом плане std::transform несколько ближе к map, нежели std::for_each. :)#include <stdio.h>
int f(int a){
return a+42;
}
int f(int a, int b){
return a+b;
}
int main(){
printf("%d\n",f(10));
printf("%d\n",f(10,11));
return 0;
}
std::bind — средство для создания «частичной специализации».int main()
{
auto concat = plus<string>();
cout << mega::curry(concat)("One string")(" Another string") << endl;
return EXIT_SUCCESS;
}
std::function<int()> getFunction()
{
int n = 10;
std::function<int()> result = [&n]()
{
return n;
}
return result;
}
Частичное применение и каррирование в C++