您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > C/C++/C#

C++代码赏析:回调中对象保活

时间:2023-01-12 15:19:08  来源:今日头条  作者:骇客遇见AI

概念

  • 类模板 std::function 是通用多态函数包装器。 std::function 的实例能存储、复制及调用任何可复制构造 (CopyConstructible) 的可调用 (Callable) 目标——函数、 lambda 表达式、 bind 表达式或其他函数对象,还有指向成员函数指针和指向数据成员指针。
  • std::enable_shared_from_this 能让其一个对象(假设其名为 t ,且已被一个 std::shared_ptr 对象 pt 管理)安全地生成其他额外的 std::shared_ptr 实例(假设名为 pt1, pt2, ... ) ,它们与 pt 共享对象 t 的所有权。

 

例子1

您可能希望将this指针捕获到c++ lambda中,但这将捕获原始指针。如果需要延长对象的生命周期,则需要捕获强引用。“捕获对自己的强引用”的常见模式是同时捕获强引用和原始this。强引用保持this为活的,并且使用this方便访问成员。

#include <functional>
#include <IOStream>
#include <memory>
#include <string>

std::vector<std::function<void(void)>> actions;

class Widget : public std::enable_shared_from_this<Widget> {    
public:
    Widget(const std::string name){name_ = name;}
    void reg() {
        // std::shared_ptr
        auto callback = [lifetime = shared_from_this(),  this]() {
                    action(name_);  
        };
        actions.push_back(callback); 
    }

    virtual void action(std::string name) {
        std::cout << "widget action:" << name << std::endl;
    }
    std::string name_;
};
class Table : public Widget {                     
public:
    Table(const std::string name):Widget(name){}
    virtual void action(std::string name) {
        std::cout << "table action:" << name << std::endl;
    }
};

void reg_action() {
    auto widget = std::make_shared<Widget>("widget");                             
    widget->reg();
    auto table = std::make_shared<Table>("table");                             
    table->reg();
}

int main(int argc, char* argv[]) {
    reg_action();
    for (const auto& action : actions) {
        action();
    }
}

输出:

widget action:widget
table action:table

在线测试

https://wandbox.org/permlink/HDrKO6Hn6tROiVEj

例子2

#include <functional>
#include <iostream>
#include <memory>

std::vector<std::function<void(void)>> actions;

class Widget : public std::enable_shared_from_this<Widget> {                     
public:
    void reg() {
        actions.push_back(std::bind(&Widget::action, shared_from_this())); 
    }

    virtual void action() {
        std::cout << "widget action" << std::endl;
    }
};

class Table : public Widget {                     
public:
    virtual void action() {
        std::cout << "table action" << std::endl;
    }
};

void reg_action() {
    auto widget = std::make_shared<Widget>();                             
    widget->reg();
    auto table = std::make_shared<Table>();                             
    table->reg();
}

int main(int argc, char* argv[]) {
    reg_action();
    for (const auto& action : actions) {
        action();
    }
}

输出:

widget action
table action


Tags:C++   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
概念 类模板 std::function 是通用多态函数包装器。 std::function 的实例能存储、复制及调用任何可复制构造 (CopyConstructible) 的可调用 (Callable) 目标&mdash;&mdash;...【详细内容】
2023-01-12  Tags: C++  点击:(0)  评论:(0)  加入收藏
C 是用于开发系统软件和任何微处理器软件的经典语言。 Linux,大部分Windows和MacOS都是写在上面的。 如果你使用任何现代可穿戴小工具或电子设备,在大多数情况下它们也会在 C...【详细内容】
2023-01-07  Tags: C++  点击:(4)  评论:(0)  加入收藏
导读:使用 C 扩展为 Python 提供特定功能。本文字数:7993,阅读时长大约: 9分钟 使用 C 扩展为 Python 提供特定功能。 在前一篇文章中,我介绍了 opensource.com。在大多数系统上,C...【详细内容】
2023-01-03  Tags: C++  点击:(19)  评论:(0)  加入收藏
CLion是一款专为开发C及C++所设计的跨平台IDE。它是以intellij为基础设计的,包含了许多智能功能来提高开发人员的生产力。这种强大的IDE帮助开发人员在Linux、OS X和Windows...【详细内容】
2022-12-27  Tags: C++  点击:(25)  评论:(0)  加入收藏
我们可以通过 时间度量 - Wall time vs. CPU time 来知道Wall time和CPU time的区别是什么,简单来讲,Wall Time就是类似我们的时钟一样,他没有很精确的表示此时CPU花了多少时...【详细内容】
2022-12-23  Tags: C++  点击:(23)  评论:(0)  加入收藏
数据类型是程序的基础:它告诉我们数据的意义以及我们能在数据上执行的操作。C++语言支持广泛的数据类型,如下: 数据类型选择: 当明确知道数值不可能为负时,选用无符号类型。 使用...【详细内容】
2022-12-08  Tags: C++  点击:(33)  评论:(0)  加入收藏
本文介绍基于C++语言,遍历文件夹中的全部文件,并从中获取指定类型的文件的方法。 首先,我们来明确一下本文所需实现的需求。现在有一个文件夹,其中包含了很多文件,如下图所示;我...【详细内容】
2022-11-16  Tags: C++  点击:(42)  评论:(0)  加入收藏
作者 | 苏宓出品 | CSDN(ID:CSDNnews)如果说此前 Kotlin、Dart、Julia、Carbon 等后起之秀向老牌编程语言发起挑战进攻都是小打小闹,那么这一次 C、C++ 这几种常青藤编程语言则...【详细内容】
2022-11-15  Tags: C++  点击:(41)  评论:(0)  加入收藏
T[N]Built-in array: a fixed-size contiguously allocated sequence of N elements of type T; implicitly converts to a T*内置数组:固定大小的连续分配的T型N个元素序列;...【详细内容】
2022-11-07  Tags: C++  点击:(82)  评论:(0)  加入收藏
前几天有个后端程序员的朋友和小慕吐槽:今年大部分的时间一直在重复着「增删改查」,回顾这一年基本没啥进步,内卷严重啊,这样下去好怕被裁员啊!在现实情况中,好像大多数人都会遭遇...【详细内容】
2022-10-25  Tags: C++  点击:(59)  评论:(0)  加入收藏
▌简易百科推荐
概念 类模板 std::function 是通用多态函数包装器。 std::function 的实例能存储、复制及调用任何可复制构造 (CopyConstructible) 的可调用 (Callable) 目标&mdash;&mdash;...【详细内容】
2023-01-12  骇客遇见AI  今日头条  Tags:C++   点击:(0)  评论:(0)  加入收藏
C 是用于开发系统软件和任何微处理器软件的经典语言。 Linux,大部分Windows和MacOS都是写在上面的。 如果你使用任何现代可穿戴小工具或电子设备,在大多数情况下它们也会在 C...【详细内容】
2023-01-07  启辰8  今日头条  Tags:C++   点击:(4)  评论:(0)  加入收藏
一:背景1. 讲故事前些天看到一个奇怪的 Function 函数,调用的是 C# 链接库中的一个 UserLogin 方法,参考代码如下:CREATE FUNCTION dbo.clr_UserLogin( @name AS NVARCHAR(1...【详细内容】
2023-01-03  一线码农聊技术  今日头条  Tags:C#   点击:(19)  评论:(0)  加入收藏
CLion是一款专为开发C及C++所设计的跨平台IDE。它是以intellij为基础设计的,包含了许多智能功能来提高开发人员的生产力。这种强大的IDE帮助开发人员在Linux、OS X和Windows...【详细内容】
2022-12-27    网易号  Tags:C++   点击:(25)  评论:(0)  加入收藏
我们可以通过 时间度量 - Wall time vs. CPU time 来知道Wall time和CPU time的区别是什么,简单来讲,Wall Time就是类似我们的时钟一样,他没有很精确的表示此时CPU花了多少时...【详细内容】
2022-12-23  编编成程  今日头条  Tags:C++   点击:(23)  评论:(0)  加入收藏
数据类型是程序的基础:它告诉我们数据的意义以及我们能在数据上执行的操作。C++语言支持广泛的数据类型,如下: 数据类型选择: 当明确知道数值不可能为负时,选用无符号类型。 使用...【详细内容】
2022-12-08  西子浣纱城  今日头条  Tags:C++   点击:(33)  评论:(0)  加入收藏
本文介绍基于C++语言,遍历文件夹中的全部文件,并从中获取指定类型的文件的方法。 首先,我们来明确一下本文所需实现的需求。现在有一个文件夹,其中包含了很多文件,如下图所示;我...【详细内容】
2022-11-16  疯狂学习GIS  CSDN  Tags:C++   点击:(42)  评论:(0)  加入收藏
在Linux开发环境上学习C语言,对于一个从零开始学习嵌入式的门外汉来说,是一个很好的选择,学习了C语言,又熟悉了Linux 操作系统。1. 开发工具下载及安装:虚拟机 VMware 10下载地址...【详细内容】
2022-11-10  嵌入式er  知乎  Tags:C语言   点击:(71)  评论:(0)  加入收藏
T[N]Built-in array: a fixed-size contiguously allocated sequence of N elements of type T; implicitly converts to a T*内置数组:固定大小的连续分配的T型N个元素序列;...【详细内容】
2022-11-07  小智雅汇  今日头条  Tags:C++   点击:(82)  评论:(0)  加入收藏
前言map 是有序的键值对容器,元素的键是唯一的,值允许重复。用比较函数 Compare 排序键。搜索、移除和插入操作拥有对数复杂度,即O(logn)。底层实现为红黑树。Map定义需要包含...【详细内容】
2022-11-07  君匡  今日头条  Tags:Cpp   点击:(41)  评论:(0)  加入收藏
站内最新
站内热门
站内头条