lambda is tuple

理解したのでメモ

melpon.org

#include <iostream>

auto stack = [](auto... xs) { 
    return [=](auto access) { 
        return access(xs...);
    }; 
}; 

auto size = [](auto xs) { 
    return xs([=](auto... z) {
        return sizeof...(z);
    }); 
};

auto push = [](auto xs, auto x) {
    return xs([=](auto... z) {
        return [=](auto access) {
            return access(x, z...);
        };
    });
};

auto pop = [](auto xs) {
    return xs([=](auto, auto... z) {
        return [=](auto access) {
            return access(z...);
        };
    });
};

auto top = [](auto xs) {
    return xs([=](auto v, auto...) {
        return v;
    });
};

int main() {
    auto s = push(push(push(stack(), 1), "lambda is tuple"), 3.14);
    std::cout << size(s) << std::endl;
    std::cout << top(s) << ", "
              << top(pop(s)) << ", " 
              << top(pop(pop(s)))
              << std::endl;
}

c++ - Is there a name for this tuple-creation idiom? - Stack Overflow