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