Как создать подкласс QRunnable для запуска любой функции-члена? - PullRequest
0 голосов
/ 03 июля 2019

Учитывая определенную задержку, я хотел бы запустить функцию-член из класса X, передав QRunnable глобальному экземпляру QThreadPool. Конструктор подкласса QRunnable будет принимать задержку int, указатель экземпляра, указатель функции-члена и аргументы функции.

Мне было интересно, как мне поступить. У меня есть следующий код, и я застрял на том, как решить эту проблему.

template<typename I, typename F, typename ...Args>
class Task : public QRunnable{

public:
    Task(int delay, I &&instance_ptr, F &&func_ptr, Args &&... args):
        delay(delay),
        instance_ptr(std::forward<I>(instance_ptr)),
        func_ptf(std::forward<F>(func_ptr)),
        args_tuple(std::forward<Args>(args)...)
    {}

    void run() override
    {
        QThread::sleep(delay);

        (instance_ptr->*func_ptr)(args_tuple) // This is where i don't know how to unpack the tuple
    }
private:
    int delay;
    I instance_ptr;
    F func_ptr;
    std::tuple<Args...> args_tuple;

}

1 Ответ

0 голосов
/ 03 июля 2019

Если у вас есть C ++ 17, вы можете использовать std::apply.

Если вы используете предыдущую версию C ++, вы должны сделать свой собственный трюк, чтобы распаковатькортеж.В Интернете их много, если вы ищете способ вызова функции с кортежами.

Страница документации из std::apply также дает вам возможную реализацию:

namespace detail {
template <class F, class Tuple, std::size_t... I>
constexpr decltype(auto) apply_impl(F&& f, Tuple&& t, std::index_sequence<I...>)
{
    return std::invoke(std::forward<F>(f), std::get<I>(std::forward<Tuple>(t))...);
}
}  // namespace detail

template <class F, class Tuple>
constexpr decltype(auto) apply(F&& f, Tuple&& t)
{
    return detail::apply_impl(
        std::forward<F>(f), std::forward<Tuple>(t),
        std::make_index_sequence<std::tuple_size_v<std::remove_reference_t<Tuple>>>{});
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...