2013-03-11 2 views
6

Есть ли способ создать typedef так, что будет скомпилирована следующая (базовая «чистая» реализация y-комбинатора)?Typedef для рекурсивной лямбда

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

Это имеет эффект создания «рекурсивную лямбды», то есть один, который вызывает себя с помощью второго лямбды, чтобы получить ссылку на себя. x в первой лямбда является ссылкой на вторую лямбду, поэтому x(x) вызывает вторую лямбду со ссылкой на себя. После этого вторая лямбда рекурсирует, вызывая x(x). Этот код при выполнении должен создавать бесконечный цикл до тех пор, пока он не достигнет переполнения стека. Более сложные реализации второй функции могут приводить к произвольному рекурсивному поведению.

Я пробовал typedef различные версии void(*)(...), но я не верю, что это удастся. Мое метапрограммирование шаблона недостаточно сильное, чтобы справляться с такими вещами.

+0

Что делает 'x (x);' предполагается делать (если это возможно)? Также, что означает аргумент '([] (f x) {x (x);})'? Дайте нам представление о том, что вы делаете. – Nawaz

+0

Просто рекурсия. Это комбинатор. – nneonneo

+0

@nneonneo: Хорошо, я не знаю, что такое y-combinator, поэтому я думаю, что мой ответ выглядит идиотским. Должно ли это просто создать бесконечную рекурсию, позвонив себе? И разрешено ли вам определять новый класс 'X', а затем' typedef X f'? –

ответ

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);}); 
} 
+0

Hm. Ну, он выполняет букву закона, если не дух (вторая лямбда в основном не используется). – nneonneo

+0

@nneonneo: Вы имеете в виду первое. – Xeo

+0

@Xeo: Хм? Первая лямбда строит «f x», используя вторую лямбду, затем вызывает «x (x)». Но вторая лямбда выбрасывается после использования для строительства. – nneonneo

Смежные вопросы