修改QtConcurrent::run支持任意参数

原QtConcurrent::run最多只支持传入5个参数,目标为实现任意数量的参数;

不支持传入带&的类型(如:int &xx, class& ...),这情况只能使用指针。

void __task_creator( MainWindow* _this, QString * srcDirPath,QString * m_dstPath

, QFileInfoList *fileList, QThreadPool* m_threadPool

, bool *m_stop, bool *m_pause, bool *m_detailed,

QMutex *m_mutex, QWaitCondition *m_pauseCondition

);

QtConcurrent::run( __task_1, 10 );

QtConcurrent::run( __task_2, 10 );

// 为每个文件创建复制任务

QtConcurrent::run( __task_creator, this

, &m_srcPath, &m_dstPath

, &fileList, &m_threadPool

, &m_stop, &m_pause, &m_detailed

, &m_mutex, &m_pauseCondition );

cpp 复制代码
#ifndef MY_QTCONCURRENT_H
#define MY_QTCONCURRENT_H

//---------------------------------
/// 新建头文件中加入以下代码即可
/// 使用方法不变
/// 不支持传入带&的类型(如:int &xx, class& ...),这情况只能使用指针
#include <QtConcurrent/QtConcurrent>
namespace QtConcurrent {

// 为C++11提供自定义的index_sequence实现
#if __cplusplus >= 201402L
// C++14及以上使用标准库
namespace detail {
    using std::index_sequence;
    using std::make_index_sequence;
}
#else
// C++11自定义实现
namespace detail {
    template<std::size_t... Is> struct index_sequence {};

    template<std::size_t N, std::size_t... Is>
    struct make_index_sequence_impl : make_index_sequence_impl<N-1, N-1, Is...> {};

    template<std::size_t... Is>
    struct make_index_sequence_impl<0, Is...> : index_sequence<Is...> {};

    template<std::size_t N>
    using make_index_sequence = make_index_sequence_impl<N>;
}
#endif

// 统一的模板实现
template <typename T, typename FunctionPointer, typename... FuncArgs>
struct _StoredFunctorCall : public QtConcurrent::RunFunctionTask<T> {
    inline _StoredFunctorCall(FunctionPointer _function, FuncArgs&&... args)
        : function(_function), arguments_(std::forward<FuncArgs>(args)...) {}

    void runFunctor() override {
        // 在C++11中,我们需要用函数重载或模板特化来替代if constexpr
        runFunctorImpl(typename std::is_void<T>::type());
    }

private:
    // 辅助函数:实现参数包展开
    template<typename F, typename Tuple, std::size_t... I>
    auto apply_impl(F&& f, Tuple&& t, detail::index_sequence<I...>)
    -> decltype(std::forward<F>(f)(std::get<I>(std::forward<Tuple>(t))...)) {
        return std::forward<F>(f)(std::get<I>(std::forward<Tuple>(t))...);
    }

    // 主函数:tuple应用函数
    template<typename F, typename Tuple>
    auto tuple_apply(F&& f, Tuple&& t)
    -> decltype(apply_impl(
        std::forward<F>(f),
        std::forward<Tuple>(t),
        detail::make_index_sequence<std::tuple_size<typename std::decay<Tuple>::type>::value>()
    )) {
        return apply_impl(
            std::forward<F>(f),
            std::forward<Tuple>(t),
            detail::make_index_sequence<std::tuple_size<typename std::decay<Tuple>::type>::value>()
        );
    }

    // void返回类型的处理
    void runFunctorImpl(std::true_type) { // std::true_type 表示 void
        // qDebug()<<"std::true_type 表示 void";
        tuple_apply(function, arguments_);
    }

    // 非void返回类型的处理
    void runFunctorImpl(std::false_type) { // std::false_type 表示 非void
        // qDebug()<<"std::false_type 表示 非void";
        this->result = tuple_apply(function, arguments_);
    }

public:
    FunctionPointer function;
    std::tuple<typename std::decay<FuncArgs>::type...> arguments_;
};

// 简化的run函数模板
template <typename T, typename... Args>
QFuture<T> run( T (*functionPointer)(Args...), Args&&... args) {
    return (new _StoredFunctorCall<T, T(*)(Args...), Args...>
            (functionPointer, std::forward<Args>(args)...))->start();
}

}; // namespace QtConcurrent
//---------------------------------

#endif // MY_QTCONCURRENT_H
相关推荐
qq_2518364579 小时前
springboot vue3 开发实现 拼豆管理系统
java·开发语言·ai编程
郑州光合科技余经理10 小时前
同城外卖小程序开发:下单成功后,后台导出能不能对上用户端状态
开发语言·前端·git·后端·uni-app·php·ai编程
知识分享小能手10 小时前
C++ 学习教程,从入门到精通,C++ 入门知识 — 完整知识点(1)
开发语言·c++·学习
qq_1998868710 小时前
第8板块·第2节:统一内存的高级特性与性能调优
c++·人工智能·gpu算力·cuda
+VX:Fegn089511 小时前
计算机毕业设计|基于springboot + vue旅游管理系统(源码+数据库+文档)
java·开发语言·vue.js·spring boot·课程设计
阿里嘎多学长11 小时前
2026-09-20 GitHub 热点项目精选
开发语言·程序员·github·代码托管
2401_8390805412 小时前
C++常见八股
数据结构·c++·算法
qq_1998868712 小时前
第6板块 第2节 CUDA运行时API与驱动API 核心笔记
c++·人工智能·gpu算力
江湖人称菠萝包13 小时前
【Qt】《Qt 5.9 C++开发指南》笔记-Chapter9-Qt Charts
笔记·qt·qt5
扶尔魔ocy13 小时前
【QT android】环境安装及第一个QT项目
qt·andriod开发