用于递归lambda的Typedef

时间:2013-03-11 18:09:16

标签: c++ c++11 lambda

有没有办法创建typedef以便以下(y-combinator的基本“纯”实现)编译?

typedef ??? f;
[](f x){x(x);} ([](f x){x(x);});

这具有创建“递归lambda”的效果,即通过使用第二个lambda来获取对自身的引用来调用自身的效果。第一个lambda中的x是对第二个lambda的引用,因此x(x)使用对自身的引用来调用第二个lambda。此后,第二个lambda通过调用x(x)进行递归。这段代码在执行时应该产生一个无限循环,直到它遇到堆栈溢出。第二个函数的更复杂的实现可以产生任意的递归行为。

我已尝试typedef各种版本的void(*)(...),但我不相信这会成功。我的模板元编程不够强大,无法处理这类事情。

1 个答案:

答案 0 :(得分:6)

这个怎么样?

#include <functional>
#include <iostream>

struct X
{
    template<typename F>
    X(F f) : _f(f)
    { }

    void operator () (std::function<void(X)> f)
    {
        std::cout << "Calling myself..." << std::endl;
        _f(f);
    }

    std::function<void(X)> _f;
};

int main()
{
    typedef X f;
    [](f x){x(x);} ([](f x){x(x);});
}