Я регулярно использую объявления классов вперед и указатели на такие классы.
Теперь мне нужно пропустить указатель на функцию через несколько слоев. Я бы предпочел включить заголовок, который объявляет прототип моего указателя функции только в модуль, который разыменовывает указатель на функцию, а не в каждый слой, который просто передает значение этого указателя.
Возможно ли это?
=====
Из ответов я подозреваю, что недостаточно четко сформулировал вопрос. Я ищу аналог для объявления класса forward. Мы все согласны, что я могу написать:
class foo;
пустая строка (foo *);
void waz (foo * p) {bar (p); }
Обратите внимание, что waz ничего не знает о классе foo, кроме его имени. Возможно, у бара будет доступ к полному описанию foo. Возможно, бар просто пройдет дальше. Какая разница? Только те сайты, которые разыменовывают foo *. Всем остальным сайтам нужен только «класс foo;».
Точно так же я знаю, что могу написать:
typedef void foo (int, double);
пустая строка (foo *);
void waz (foo * p) {bar (p); }
Разница в том, что теперь идентификатор foo не только известен как обозначающий тип функции, но также уже содержит полную сигнатуру / прототип. Это приводит меня к одному из двух неприятных сценариев:
1) клонировать typedef на нескольких сайтах (хм! Хрупкий!)
2) вставьте typedef в заголовок и включайте его везде, где упоминается foo *.
Обратите внимание на асимметрию: в случае объекта данных мне нужно было предоставить полное описание класса foo только в тех местах, где я хочу разыменовать foo *; в случае функции мне нужно предоставить полную сигнатуру / прототип везде, где я хочу упомянуть foo *.
Так есть ли способ исправить эту асимметрию?