Функция обратного вызова в классе QThread - PullRequest
0 голосов
/ 12 мая 2019

У меня есть класс на основе QThread, в основном поток с графическим интерфейсом.В этой теме я использую другой класс, который имеет определение типа этой функции:

void SomFunc(const std::function<void (int, std::string, int)> &data)

Я хочу создать функцию обратного вызова в моем классе, такую ​​как MyThread :: Callback, и вызвать функцию выше и передать мой MyThread ::Функция обратного вызова в качестве фактической функции обратного вызова.Что бы я ни пытался, я что-то пропускаю в конце, я действительно запутался в std :: function и мне нужна помощь.Как определить функцию, которую я могу передать в качестве аргумента SomFunc и получить надлежащие обратные вызовы в контексте моего класса MyThread

Если я просто создаю функцию void, это то, что я получаю:

error: reference to type 'const std::function<void (int, std::string, int)>' (aka 'const function<void (int, basic_string<char>, int)>') could not bind to an rvalue of type 'void (MyClass::*)(int, std::string, int)'

1 Ответ

0 голосов
/ 13 мая 2019

Вы можете сделать следующее:

#include <iostream>
#include <string>

void f(int a, std::string b, int c)
{
    std::cout << a << " -- " << b << " -- " << c << std::endl;
}

void someFunc(void (inner)(int, std::string, int), int a, std::string b, int c)
{
    inner(a, b, c);
}

int main()
{
    int a = 5;
    std::string b("text");
    int c = 10;

    someFunc(f, a, b, c);

    return 0;
}

Также возможно явно передать указатель или ссылку:

void someFunc(void (*inner)(int, std::string, int), int a, std::string b, int c)
// OR
void someFunc(void (&inner)(int, std::string, int), int a, std::string b, int c)

Если вы используете синтаксис указателя, выможет заменить вызов на:

someFunc(&f, a, b, c);

Но в любом случае компилятор автоматически заменит ваш синтаксис указателем, поэтому вам не нужно явно использовать синтаксис указателя в C ++.

Надеюсь, это поможет.

...