#include <iostream>
#include <functional>

template <typename Arg1, typename Arg2, typename Cap1, typename Cap2>
struct my_lambda : std::binary_function<Arg1, Arg2, void>
{
    my_lambda(const Cap1& c1, const Cap2& c2) : cap1(c1), cap2(c2) {}

    void operator()(const Arg1& arg1, const Arg2& arg2) const
    {
        // lambda body
        std::cout << (cap1 + cap2 + arg1 + arg2) << std::endl;
    }

    mutable Cap1 cap1;
    mutable Cap2 cap2;
};

template <typename Arg1, typename Arg2, typename Cap1, typename Cap2>
my_lambda<Arg1, Arg2, Cap1, Cap2> lambda(const Cap1& c1, const Cap2& c2)
{
    return my_lambda<Arg1, Arg2, Cap1, Cap2>(c1, c2);
}

int main()
{
    int i = 1, j = 2;
    lambda<int, int>(i, j)(3, 4);
}
