Используйте boost :: function , полиморфную оболочку для любого объекта, который может быть вызван с вашей подписью (включая функции, объекты функций и т. Д.).
map<string, function<void()>> ...;
Обратите внимание, что новый стандарт C ++ уже включает function
в <functional>
.
Для объяснения фона: Единственный встроенный механизм такого рода в C ++ - это старые указатели функций в стиле C (void (*)()
). Это чрезвычайно низкоуровневые, в основном просто хранящие адрес памяти функции, и поэтому далекие от того, чтобы даже приблизиться к мощности делегатов C #.
Вы не можете создавать анонимные функции, а также не можете ссылаться на функции-члены конкретного объекта или любые переменные или данные (замыкания).
Таким образом, часто используются так называемые функторы , которые являются классами, имитирующими поведение функции , перегружая operator ()
. В сочетании с шаблонами они используются везде, где могут использоваться обычные указатели функций.
Проблема в том, что эти функторы часто состоят из своеобразных или анонимных типов, на которые нельзя ссылаться удобно.
function
- самый крутой способ решить их все - все, что ведет себя как функция, включая новые классные выражения в лямбда-стиле.
function<void()> f = []() { cout << "Hello, World"> };
f();