Функция возвращает указатель на себя?
Возможно ли в С++ написать функцию, которая возвращает указатель на себя?
Если нет, предложите другое решение, чтобы выполнить следующий синтаксис:
some_type f ()
{
static int cnt = 1;
std::cout << cnt++ << std::endl;
}
int main ()
{
f()()()...(); // n calls
}
Это должно печатать все числа от 1 до n
.
Ответы
Ответ 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