В Boost listinglist следующий хитроумный трюк для создания корневого объекта был недавно отправлен @LouisDionne:
#include <iostream>
auto list = [](auto ...xs) {
return [=](auto access) { return access(xs...); };
};
auto length = [](auto xs) {
return xs([](auto ...z) { return sizeof...(z); });
};
int main()
{
std::cout << length(list(1, '2', "3")); // 3
}
Умность заключается в том, что list
- это лямбда, который принимает переменный список параметров в качестве входных данных и возвращает лямбда в качестве вывода, на который будет поступать другая лямбда. Аналогично, length
представляет собой лямбда, берущую список-подобный объект, к которому он будет поставлять переменный sizeof...
оператор к исходным входным параметрам списка. Оператор sizeof...
обернут внутри лямбда, так что его можно передать в list
.
Вопрос: есть ли имя для этой именования создания набора? Возможно, из функционального языка программирования, где более часто используются функции более высокого порядка.