もうちょっとなんだが

using namespace boost;

function<int(int)> fact_maker_(any f) {
    struct lambda {
        static int fact(function<int(int)> g, int n) {
            return n ? n * g(n - 1) : 1;
        }
    };

    function<function<int(int)>(any)> (* const any_cast_)(any &) = any_cast<function<function<int(int)>(any)> >;

    return bind(lambda::fact,
                bind(any_cast_(f),
                     f),
                _1);
}

function<function<int(int)>(any)> fact_maker = fact_maker_;

fact_maker(fact_maker)(5) // 120

ここまでは書けたんだがこの先fact_makerの名前を消すのに苦戦中。