Скажем, у меня есть пространство имен KeyManager
и у меня есть функция press
std::vector<std::function<void()>*> functions;
void KeyManager::addFunction(std::function<void()> *listener)
{
functions.push_back(listener);
}
void KeyManager::callFunctions()
{
for (int i = 0; i < functions.size(); ++i)
{
// Calling all functions in the vector:
(*functions[i])();
}
}
и у меня есть класс Car
а в конструкторе автомобиля я хочу передать его относительный указатель функции на такую функцию класса:
void Car::printModel()
{
fprintf(stdout, "%s", this->model.c_str());
}
Car::Car(std::string model)
{
this->model = model;
KeyManager::addFunction(this->printModel);
}
При попытке передать указатель относительной функции я получаю следующую ошибку:
error C3867: 'Car::printModel': function call missing argument list; use '&Car::printModel' to create a pointer to member
Как это исправить?
Вы должны использовать std::bind
для создания std::function
которая вызывает функцию-член на конкретном объекте. Вот как это работает:
Car::Car(std::string model)
{
this->model = model;
KeyManager::addFunction(std::bind(&Car::printModel, this));
}
Есть ли конкретная причина, по которой вы передаете std::function
качестве указателя вместо значения? Если вы не связываете какие-либо аргументы, которые дорого копировать, я бы предпочел не делать этого.
Кроме того, функции callFunctions
можно упростить, используя лямбда:
void KeyManager::callFunctions()
{
for (auto & f : functions)
f();
}
for (auto & f : functions) f();