<>
Не буду сильно углубляться в теорию. Что такое частичное применение легко найти в интернете. В том числе [на Википедии][1].
Если кратко, то это механизм, позволяющий зафиксировать `k` аргументов функции от `n` аргументов, сделав из неё функцию от `(n - k)` аргументов.
// Пусть имеется функция f от четырёх аргументов:
int f (int a, int b, int c, int d)
{
return a + b + c + d;
}
// Фиксируем первые два аргумента:
auto g = part(f, 1, 2); // 1 + 2 + ...
// Добрасываем оставшиеся два:
assert(g(3, 4) == 10); // ... + 3 + 4 = 10
На эту тему уже существует масса публикаций, в том числе и на Хабре:
1. [C++ Variadic templates. Каррирование и частичное применение][2]
2. [Частичное применение и каррирование в C++][3]
3. [Каррируем на C++][4]
А ветка "[How should I make function curry?][5]" на stackoverflow — просто кладезь для тех, кто впервые сталкивается с этой темой.
К сожалению, количество пока не переросло в качество, и хорошего, пригодного к использованию варианта я так и не увидел.
При этом любопытно вот что.
**Замечательный факт №1**. В упомянутых статьях присутствуют все техники, которые нужны для реализации правильного (по моему мнению) частичного применения.
Надо только всё внимательно проанализировать и сложить кубики в правильном порядке.
Именно этим я и собираюсь заняться в данной статье.
[Читать дальше →][6]
[1]:
https://ru.wikipedia.org/wiki/Частичное_применение
[2]:
https://habrahabr.ru/post/133084
[3]:
https://habrahabr.ru/post/149056
[4]:
https://habrahabr.ru/post/238879
[5]:
http://stackoverflow.com/questions/26655685/how-should-i-make-function-curry
[6]:
https://habrahabr.ru/post/313370/?utm_source=habrahabr&utm_medium=rss&utm_campaign=feed_posts#habracut