6

有没有办法创建一个typedef这样的(y-combinator的基本“纯”实现)可以编译?

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

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

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

4

1 回答 1

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);});
}
于 2013-03-11T18:23:07.460 回答