std::function

std::functional 是 C++ 标准库中的一个模板类,它是对可调用对象的一种通用包装器。std::functional 允许你将任何可调用对象(包括函数、函数对象、lambda 表达式、以及其他 std::functional 对象)当作一个统一的对象来处理。它通常与 C++ 的算法库、容器库以及某些需要可调用对象的库(如 std::thread)一起使用。

std::functional 的主要优势在于它提供了一种类型擦除的机制,允许你以统一的接口存储和操作不同类型的可调用对象。这对于泛型编程和编写灵活的接口非常有用。

下面是一个使用 std::functional 和 std::thread 的例子:

#include <iostream>  
#include <thread>  
#include <functional>  
  
// 普通的函数  
void my_function(int value) {  
    std::cout << "Running in thread with value: " << value << std::endl;  
}  
  
// 定义一个可调用对象(函数对象)  
struct MyFunctor {  
    void operator()(int value) const {  
        std::cout << "Running in thread with functor and value: " << value << std::endl;  
    }  
};  
  
int main() {  
    // 使用 std::functional 包装普通函数  
    std::function<void(int)> func_wrapper_function = my_function;  
      
    // 使用 std::functional 包装函数对象  
    std::function<void(int)> func_wrapper_functor = MyFunctor();  
      
    // 使用 lambda 表达式,它本身就是一个可调用对象,但也可以被 std::functional 包装  
    std::function<void(int)> func_wrapper_lambda = [](int value) {  
        std::cout << "Running in thread with lambda and value: " << value << std::endl;  
    };  
      
    // 创建线程,传递 std::functional 对象  
    std::thread t1(func_wrapper_function, 10);  
    std::thread t2(func_wrapper_functor, 20);  
    std::thread t3(func_wrapper_lambda, 30);  
      
    // 等待线程结束  
    t1.join();  
    t2.join();  
    t3.join();  
      
    return 0;  
}

在这个例子中,我们创建了三个 std::function 对象,每个对象都包装了一个不同类型的可调用对象:一个函数、一个函数对象以及一个 lambda 表达式。然后,我们将这些 std::function 对象作为参数传递给 std::thread 的构造函数,以在新线程中执行它们。

std::functional 的一个主要缺点是它可能引入一些运行时开销,因为相对于直接调用函数或函数对象,它需要进行类型擦除和间接调用。然而,在需要灵活性和类型安全性的情况下,这种开销通常是值得的。

 

posted @ 2024-03-31 23:27  He_LiangLiang  阅读(39)  评论(0编辑  收藏  举报