Передача указателей относительной функции в качестве параметров

0

Скажем, у меня есть пространство имен 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

Как это исправить?

  • 0
    Можете ли вы предоставить код для "Car :: testKey", я не нашел его в посте.
  • 0
    Извините, я скопировал и вставил ошибку из моего производственного кода и забыл переименовать ее для примера.
Теги:
pointers
std-function
stdvector

1 ответ

1

Вы должны использовать 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();
}
  • 1
    Это может быть упрощено в дальнейшем с помощью цикла for: for (auto & f : functions) f();
  • 0
    Ха, до сих пор не привыкли ко всему этому новому C ++ 11.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню