Чтение вопроса в stackoverflow, я задавался вопросом, можно ли объявить функцию, которая берет указатель на себя. То есть сделать такое объявление foo
, для которого было бы правильным:
foo(foo);
Простейшая идея заключается в том, чтобы использовать другой указатель на функцию (нельзя использовать для void*
, поскольку она может быть меньше), поэтому объявление функции выглядит следующим образом:
void foo(void (*)());
Пока это ОК в C (и будет работать с кастингом на С++), мне интересно, можно ли это сделать без такой сложной "переинтерпретации" кастинга или потери информации о типе.
Другими словами, я хочу следующее выражение:
void foo( void (*)( void (*)( void (*) ( ... ))));
но, конечно, неограниченные декларации невозможны. Наивное typedef
ing тоже не помогает.
Шаблоны С++ приветствуются, даже если они делают код вызова (foo(foo)
) выглядят немного менее краткими, но все же конечными.
Ответы на C-стиль, которые показывают, как можно удалить информацию о типе без кастинга или другие трюки такого рода, конечно, интересны, но не будут приняты.