首页 > 其他分享 >std::function

std::function

时间:2024-03-31 23:33:05浏览次数:18  
标签:std function 调用 函数 对象 functional

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

 

标签:std,function,调用,函数,对象,functional
From: https://www.cnblogs.com/music-liang/p/18107490

相关文章

  • std::make_shard 和 new 的比较
    std::make_shared和new都用于动态分配内存并返回指向该内存的指针,但它们之间有一些重要的区别。下面详细解释它们之间的差异:内存分配方式:std::make_shared:该函数是一个模板函数,会在内存中分配一块足够大的内存来存储对象及其控制块(用于跟踪引用计数等信息),然后在此内存上构......
  • 获取std::exception_ptr指向的异常信息
    1、产生std::exception_ptr的方式:std::exception_ptrptr=nullptr;//用来保存异常信息try{test();}catch(...){std::exception_ptrptr=std::current_exception();//这是exeception_ptr产生的地方}或std::exception_ptrptr2......
  • 函数调用约定——__cdecl与__stdcall
    1.定义函数调用约定,也称函数调用协议,是指在函数调用时,确定函数参数如何传递给被调用的函数,以及如何返回结果值给调用者的一系列规则。也就是函数的调用者与被调用者之间如何传参以及如何恢复栈平衡。2.职责规定了函数参数的压栈顺序,即有多个参数时,按照什么顺序进行压栈;规定了......
  • vuex.esm.js:135 Uncaught Error: [vuex] getters should be function but “getters.
    报错vuex.esm.js:135UncaughtError:[vuex]gettersshouldbefunctionbut"getters.mode"inmodule"userModule"is"dark".atassert(vuex.esm.js:135:1)原因:在使用vuex的moulds时index.js中已创建了一个vue实例newVuex.Store,在模块文件中又再创建了一个,导致报......
  • dubhe2024 BuggyAllocator:通过修改_IO_2_1_stdout_的内容进行任意读
    在堆题中遇到没有show()函数的情况,导致无法泄露地址。这时可以通过修改_IO_2_1_stdout_来强制程序输出一段内存,从而泄露需要的地址。例题:dubhe2024BuggyAllocatordubhe2024,xctf分站赛最后一场凄惨爆零,主看了这道题一整天,逆清楚了但找不到漏洞。事后来看当时就算找到洞了也不会......
  • Ubuntu20.04安装openCV+contrib报错:fatal error: boostdesc_bgm.i: No such file or d
    把文件前面的数字去掉,改成boostdesc_bgm.i,不可用!!!!文件可能没有下载成功!!当时可能会编译成功,但是之后还是会报错下载缺少的相关依赖https://pan.baidu.com/s/17XhXX_cLz46bsj9ZWRkNIg提取码:p50x最好在本地解压后压缩成zip格式的,否则直接解压rar格式的会报错; 如果继续出现以......
  • 【平台开发】MTK6833——add harware command queue function in lk
    CQE实现主要步骤(参考协议)Hostsystem结构commandqueue任务结构:2.TheoryofOperation(操作理论)init(初始化)初始化,enableCQ配置CQCFGTaskDescriptorsize配置CQTDLBA(CommandQueuingTaskDescriptorListBaseAddress)和CQTDLBAU(CommandQueuingTaskDe......
  • How to use the smb function of Babyfile App (connect Mac computer)
    1.Mac computer "SystemSettings"->"General"->"Sharing" reachthepagebelow(ordirectlysearchfor"FileSharing"onthesystemsettingspagetoreachthepage).Thenclickthebuttonshownin①2.Then......
  • std::sort 错误"Expression : invalid operator <"
    解决:std::sort的比较函数,切记仅使用小于或大于,不要使用小于等于或大于等于。即所谓的“strictweakordering”,也就是说,如果a==b,则返回的应该是false,如果返回的是true,则会出上面的错这个问题是标准库sort实现导致的参考https://blog.csdn.net/qq_35097289/article/details/1046......
  • Z_Function
    defz_func(s:str)->list:n=len(s)z=[0]*(n)l,r=0,0foriinrange(1,n):ifi<r:z[i]=min(r-i,z[i-l])whilei+z[i]<nands[z[i]]==s[i+z[i]]:z[i]+=1ifi+z[i]......