only-lucky 2025-04-25 08:52 采纳率: 50%
浏览 13

C++11可调用对象

C++11中如何使用std::function和std::bind 包装一个类的成员函数来使用,以及如何调用QtConcurrent框架并行执行任务
std::function是一个可调用对象包装器,是一个类模板,可以容纳除了类成员函数指针之外的所有可调用对象,它可以用统一的方式处理函数、函数对象、函数指针,并允许保存和延迟它们的执行。

    QList<int> ls;
    ls << 1 << 2 << 3 << 4 << 5;
    qDebug() << ls;
   
    auto func1 = std::bind(&QWidget_tt::test, this);
    func1();// 正确
    QtConcurrent::blockingMap(ls, func1);// 正确
    qDebug() << "=========";

    std::function<void(QWidget_tt*) > func2  = std::bind(&QWidget_tt::test,std::placeholders::_1);
    func2(this); // 正确
    //“_Ret std::_Func_class<_Ret,QWidget_tt *>::operator ()(QWidget_tt *) const”: 无法将参数 1 从“T”转换为“QWidget_tt *”
    QtConcurrent::blockingMap(ls, func2 );  //编译报错
    qDebug() << "=========";

    //std::function<void(QWidget_tt*) > func3 = std::bind(&QWidget_tt::test,this); //错误 bind函数预绑定的参数是以值传递的形式,可能是这个问题这里报错误了
    //func3(); //错误


  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2025-04-25 08:52
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    C++11可调用对象

    你想使用 std::functionstd::bind 包装一个类的成员变量,以便使用 QtConcurrent 框架并行执行任务。

    首先,需要使用 std::bind 将成员变量绑定到一个可调用对象中,然后将其包装到 std::function 中。下面是一个示例代码:

    #include <functional>
    #include <QtConcurrent>
    
    class MyClass {
    public:
        void doSomething(int x) {
            // todo
        }
    };
    
    int main() {
        MyClass obj;
        QList<int> ls;
    
        // 使用 std::bind 将成员变量绑定到一个可调用对象中
        auto boundFunc = std::bind(&MyClass::doSomething, &obj, std::placeholders::_1);
    
        // 使用 std::function 包装可调用对象
        std::function<void(int)> func = boundFunc;
    
        // 使用 QtConcurrent 框架并行执行任务
        QtConcurrent::run(func, ls.begin(), ls.end());
    
        return 0;
    }
    

    在上面的代码中,我们使用 std::bindMyClassdoSomething 成员变量绑定到一个可调用对象中,然后将其包装到 std::function 中。最后,我们使用 QtConcurrent::run 并行执行任务。

    注意,在使用 std::bind 时,需要使用 std::placeholders::_1 作为占位符,以便将参数传递给成员变量。

    评论

报告相同问题?

问题事件

  • 修改了问题 4月25日
  • 修改了问题 4月25日
  • 创建了问题 4月25日