Проблемы с синтаксисом в C ++ std :: function - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь сохранить указатель функции для последующего обратного вызова, например:

Task->Sync->SetPeriodicTask( &TaskAssigner::ReadAndRelay );

Класс TaskAssigner объявляет void ReadAndRelay () и содержит объект SyncManager * Sync.

(Это может быть странно, но дочерний объект Sync должен вызывать функцию своего родительского класса через определенные промежутки времени).

Я пытаюсь сделать это так:

void SyncManager::SetPeriodicTask(std::function<void()> func) {
    CB_func_periodic = func;
    //CB_func_periodic = std::bind(&func, this, std::placeholders::_1);
}

Объявление переменной члена (SyncManager.h):

private:
    using func = std::function<void()>;
    func CB_func_periodic;

Я не уверен, каков правильный синтаксис здесь, так как я получаю так много ошибок.Попытка поиска ошибок, но я не смог найти ответ, который подходит моему случаю, и я не хочу, чтобы параметр SetPeriodicTask (..) был слишком сложным для записи другими пользователями.Как мне подойти к этому?

1 Ответ

0 голосов
/ 31 мая 2018

Вот пример кода, основанный на информации, которую вы опубликовали до сих пор:

#include <functional>

using func = std::function<void()>;

struct S
{
    func CB_func_periodic;
    void SetPeriodicTask( func f ) { CB_func_periodic = f; }
};

struct R
{
    void ReadAndRelay() {}
    S s;
};

int main()
{
    R r;
    r.s.SetPeriodicTask( [&] { r.ReadAndRelay(); } );
}

Аргумент SetPeriodicTask должен быть Callable , потому что эта функция вызывает его.Адрес функции-члена не может быть вызван.

Код должен быть структурирован так, чтобы периодическая задача не могла быть вызвана после уничтожения r.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...