Привет, хабр. Как-то раз, одним прекрасным воскресным днём писал я код _одного своего проекта_. Код выглядел как-то так, если упрощать:
const bool exists = WithObject (objectId,
[] (const Media::IAudioSource*, const QModelIndex&) { return true; },
[] (const QModelIndex&) { return false; });
`WithObject` пытается найти некоторый объект по его ID и выполняет первый функтор, если он найден, иначе выполняет второй функтор, если объект не найден. При этом возвращается значение, которое вернул выполненный функтор (подразумевается, что возвращаемый тип второго функтора приводим к типу первого). Функторам при этом передаётся всякая разная полезная информация, полученная в ходе поиска (например, сам объект). Вышеприведённый код, соответственно, просто проверяет существование объекта, и аргументы, которые `WithObject` передаёт функторам, оказываются не нужны. Так вот, подумалось мне, неплохо было бы написать такую функцию `DropArgs()`, чтобы вот такой код
const bool exists = WithObject (objectId,
DropArgs ([] { return true; }),
DropArgs ([] { return false; }));
был корректным. Или, что то же самое, чтобы можно было писать `DropArgs ([] { return false; }) (0, 3.14, "foobar");`. А если нужны только первые N аргументов, остальные тоже можно было не указывать: `DropArgs ([] (int n) { return n; }) (0, 3.14, "foobar");`. [Читать дальше →][1]
[1]:
http://habrahabr.ru/post/264157/#habracut