2013-11-22 2 views
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

Можете ли вы предоставить код для «Автомобиль :: TestKey» Я не нашел его в должности. –

+0

Извините, я скопировал и вставил ошибку из моего производственного кода и забыл переименовать ее для примера. –

ответ

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 (auto & f: functions) f();' –

+0

Ха, до сих пор не привык ко всем этим новым материалам C++ 11. –

+0

Мне нужно передать указатель на std :: function ... не на функцию. –

Смежные вопросы