2010-07-01 2 views
2

Я хочу написать код так:Как определить функцию, которая может вернуть указатель на себя?

/*something*/ Fn() { ... } 

int main() 
{ 
    /*something*/ fn = Fn; 
    while(fn) fn = fn(); 
    return 0; 
} 

Можно ли сделать это полностью ввести безопасный путь? Предположим, что C, C++, D, C#, Java или любой другой статически типизированный язык.

+0

Что вы эндшпиль #? –

+0

Он делает очень простой двигатель DFA. Или с 'vector ', движок NFA – BCS

+0

возможный дубликат [Self referential type] (http://stackoverflow.com/questions/3048689/self-referential-type) Кстати, принятый ответ не является ответом на ваш вопрос , Посмотрите на второй ответ. –

ответ

1

Вот пример C

delegate MyFunctionDelegate MyFunctionDelegate(); 

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyFunctionDelegate fn = FN1; 
     while (fn!=null) 
      fn = fn(); 
    } 

    static MyFunctionDelegate FN1() 
    { 
     Console.WriteLine("FN1 called"); 
     MyFunctionDelegate returnDelegate = FN2; 
     return returnDelegate; 
    } 

    static MyFunctionDelegate FN2() 
    { 
     Console.WriteLine("FN2 called"); 
     return null; 
    } 
} 
+0

C# Я полагаю ??? – BCS

+0

Да, извините, я упомянул об этом в моих источниках. post и пришлось редактировать для форматирования. По-моему, это немного более прямолинейно в C/C++, но C# дает вам сильную типизацию. С помощью C/C++ указатель может указывать на что угодно и где угодно. –