6

typedef以下(y-combinatorの基本的な「純粋な」実装)がコンパイルされるようなものを作成する方法はありますか?

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

これには、「再帰ラムダ」を作成する効果があります。つまり、2番目のラムダを使用して自分自身への参照を取得することによって自分自身を呼び出すものです。x最初のラムダは2番目のラムダへx(x)の参照であるため、それ自体への参照を使用して2番目のラムダを呼び出します。その後、2番目のラムダは。を呼び出すことによって再帰しx(x)ます。このコードを実行すると、スタックオーバーフローが発生するまで無限ループが発生します。2番目の関数のより洗練された実装は、任意の再帰的な動作を生成できます。

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 に答える