Подтвердить что ты не робот

Функция возвращает указатель на себя?

Возможно ли в С++ написать функцию, которая возвращает указатель на себя?

Если нет, предложите другое решение, чтобы выполнить следующий синтаксис:

some_type f ()
{
    static int cnt = 1;
    std::cout << cnt++ << std::endl;
}
int main ()
{
    f()()()...(); // n calls
}

Это должно печатать все числа от 1 до n.

4b9b3361

Ответ 1

struct function
{
   function operator () ()
   { 
       //do stuff;
       return function();
   }
};

int main()
{
   function f;
   f()()()()()();
}

Вы можете выбрать ссылку на функцию, если необходимо, и вернуть *this;

Обновление: Конечно, невозможно, чтобы функция типа T возвращала T* или T&

Update2:

Конечно, если вы хотите сохранить свой синтаксис... это

some_type f()
{
}

Тогда здесь Идея

struct functor;
functor f();
struct functor
{
   functor operator()()
   {
      return f();
   }
};

functor f()
{  
    return functor();
}

int main()
{
    f()()()()();
}

Ответ 2

Нет, вы не можете, потому что возвращаемый тип должен включать возвращаемый тип функции, который является рекурсивным. Вы можете, конечно, возвращать функциональные объекты или что-то подобное, что может сделать это.

Ответ 3

Вы можете использовать шаблон объектов функции:

struct f
{
  f& operator () ()
  {
    static int cnt = 1;
    cout<<cnt++<<endl;
    return *this;
  }
};

Просто нужно добавить еще один (). Использование:

f()()()(); //prints 1,2,3

Вот демо.

Ответ 4

Конечно, это возможно, просто посмотрите следующий код:


#include <stdio.h>

typedef void * (*func)();

void * test()
{
    printf("this is test\n");
    return (void *)&test;
}

int main()
{
    (*(func)test())();
}

Результат:


[email protected]:~/work/test> gcc test_func.cc -o test          
[email protected]:~/work/test> ./test
this is test
this is test