Самый простой и гибкий способ - использовать std :: function.
Предположим, у меня есть функция (но это может быть и класс), которая должна вызывать другую функцию, переданную ей. Я определяю эту функцию так:
#include <functional> // defines std::function
#include <iostream>
typedef std::function<bool(int)> FunctionPtr;
void myFunction (const FunctionPtr &functionPtr)
{
std::cout << "Before" << std::endl;
functionPtr(123);
std::cout << "After" << std::endl;
}
Первый пример использования этого - использование глобальной функции (или статического метода), например:
bool myFunPtr(int i)
{
std::cout << "FunPtr:" << i << std::endl;
return true;
}
int main()
{
myFunction (myFunPtr);
}
Я просто передаю указатель на функцию myFunction.
Я также могу использовать лямбда-выражение, например:
int main()
{
myFunction ([](int i)->bool{std::cout << "Lambda:" << i << std::endl;return true;});
}
Третий пример (и, вероятно, тот, который вам нужен) - это передача экземпляра класса, который определил функцию-оператор, например:
class X
{
public:
X(std::string s) : m_s(s) {}
bool operator()(int i)
{
std::cout << m_s << i << std::endl;
return true;
}
private:
std::string m_s;
};
int main()
{
myFunction ([](int i)->bool{std::cout << "Lambda:" << i << std::endl;return true;});
myFunction (myFunPtr);
X x1("x1:");
myFunction (x1);
X x2("x2:");
myFunction (x2);
}
Как вы можете видеть, используя std :: function, я могу передать 3 различных типа «ссылок на функции» (указатели на функции, лямбда-выражения и функторы).