У меня есть эта проблема, когда указатель функции C++ сохраняется вместе с набором аргументов для его вызова, чтобы его можно было вызвать позже. Вызывающий код не знает тип и аргументы функций. Сохранение и вызов указателей функций и аргументов чрезвычайно критичны в моем приложении. Интерфейс должен выглядеть следующим образом:Сохранение указателя функции + аргументы для последующего использования
void func(int a, char * b);
call_this_later(func, 5, "abc");
Самое простое решение, чтобы положить всю эту информацию в функтора, требуя другого ЬурейеЕ за вызываемой функции. C++ 11 позволил бы мне сделать это с использованием вариационного шаблона, так что все в порядке.
Поскольку тип функтора неизвестен в точке вызова, представляется необходимым создать виртуальный базовый класс для этих функторов и вызвать функторы, используя вызовы виртуальных функций. Накладные расходы на виртуальные функции + распределение кучи слишком высоки (я нажимаю границы реализации этой идиомы с минимальными инструкциями по сборке). Поэтому мне нужно другое решение.
Любые идеи?
Я считаю, что ':: boost :: function' и' :: std :: tr1 :: function' делают именно то, что @Hans не хочет делать. Я думаю, что они используют виртуальные функции и динамическое распределение. – Omnifarious
@Omnifarious: зависит от функции/функтора, используемой для динамического выделения. для функций с небольшим количеством типов POD существует внутреннее хранилище, которое он будет использовать, однако, да, он действительно использует (очень глубокую) скрытую виртуальную таблицу для фактического выполнения вызова функции. – diverscuba23