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