概念类模板std::function是一个通用的多态函数包装器。std::function的实例可以存储、复制和调用任何CopyConstructible(Callable)目标——函数、lambda表达式、绑定表达式或其他函数对象,以及指向成员函数的指针和指向数据成员指针的指针。std::enable_shared_from_this使它的一个对象(假设命名为t并且已经由std::shared_ptr对象pt管理)安全地生成其他额外的std::shared_ptr实例(假设命名为pt1、pt2、...),它与pt共享对象t的所有权。示例1您可能希望将this指针捕获到c++lambda中,但这将捕获原始指针。如果需要延长对象的生命周期,就需要捕获强引用。“捕获对self的强引用”的常见模式是同时捕获强引用和原始this。强引用使它保持活动状态,并使用它来轻松访问成员。#include#include#include#includestd::vector>actions;classWidget:publicstd::enable_shared_from_this{public:Widget(conststd::stringname){name_=name;}voidreg(){//std::shared_ptrautocallback=[lifetime=shared_from_this(),this](){action(name_);};actions.push_back(回调);}virtualvoidaction(std::stringname){std::cout<<"widgetaction:"<("widget");部件->reg();自动表=std::make_shared<表>("表");table->reg();}intmain(intargc,char*argv[]){reg_action();for(constauto&action:actions){动作();}}输出:widgetaction:widgettableaction:table在线测试https://wandbox.org/permlink/HDrKO6Hn6tROiVEj示例2#include#include#includestd::vector>actions;classWidget:publicstd::enable_shared_from_this{public:voidreg(){actions.push_back(std::bind(&Widget::action,shared_from_this()));}virtualvoidaction(){std::cout<<"widgetaction"<();部件->reg();自动表=std::make_shared<表>();table->reg();}intmain(intargc,char*argv[]){reg_action();for(constauto&action:actions){动作();}}输出:widgetactiontableaction