• C++ std::ref函数的三大应用场景


    std::ref 函数通常在以下几个场景中非常有用:

    1.在标准库算法中传递引用参数: 有些算法要求传递可调用对象,而这些对象可能需要引用传递。std::ref 可以用来确保按引用传递可调用对象。

    #include 
    #include 
    #include 
    #include 
    
    void modifyValue(int& x) {
        x *= 2;
    }
    
    int main() {
        std::vector<int> values = {1, 2, 3, 4, 5};
    
        // 使用 std::for_each 调用 modifyValue
        std::for_each(values.begin(), values.end(), std::ref(modifyValue));
    
        for (const auto& value : values) {
            std::cout << value << " ";
        }
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这个例子中,std::for_each 要求传递一个可调用对象,而 modifyValue 是一个需要引用传递的函数。通过使用 std::ref,我们可以将 modifyValue 引用传递给 std::for_each。
    2.在多线程环境中传递引用: 在多线程编程中,有时需要在多个线程之间共享数据,但又希望通过引用传递数据而不是通过复制。std::ref 可以用于确保在多线程环境中引用传递数据。

    #include 
    #include 
    
    void threadFunction(int& x) {
        std::cout << "Thread ID: " << std::this_thread::get_id() << ", Value: " << x << std::endl;
    }
    
    int main() {
        int sharedValue = 42;
    
        // 启动一个线程并传递 sharedValue 的引用
        std::thread t(std::ref(threadFunction), std::ref(sharedValue));
    
        t.join();
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这个例子中,std::ref 用于确保 threadFunction 中对 sharedValue 的引用传递。
    3.作为通用引用传递: std::ref 可以使函数接受任何类型的引用而不仅仅是特定类型的引用。这样,函数可以更通用,可以接受任何支持的类型,而不仅仅是特定类型的引用。

    #include 
    #include 
    
    template <typename T>
    void genericFunction(std::reference_wrapper<T> ref) {
        T& value = ref;
        std::cout << "Value: " << value << std::endl;
    }
    
    int main() {
        int intValue = 42;
        double doubleValue = 3.14;
    
        genericFunction(std::ref(intValue));
        genericFunction(std::ref(doubleValue));
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这个例子中,genericFunction 使用 std::reference_wrapper 作为参数类型,这使得它可以接受任何类型的引用。

    总的来说,std::ref 主要用于在需要引用传递而不是值传递的场景中,提供一种方便而灵活的方式。

  • 相关阅读:
    FFmpeg中内存分配和释放相关的源码:av_malloc函数、av_mallocz函数、av_free函数和av_freep函数分析
    Git常用命令及解释
    Scala语言使用Selenium库编写网络爬虫
    计算机毕业设计之java+javaweb的美容院管理系统
    elsa-workflows工作流持久化及通过MVC Page页面发起及完成
    7年Android程序员转行一、二、三事
    MAC苹果电脑如何压缩rar文件?
    网络安全专业应届生必备的几个实用工具,快收藏
    VUEX的基础使用存值及异步
    数据可视化
  • 原文地址:https://blog.csdn.net/qq_51282224/article/details/134430005