成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C++代碼賞析:回調(diào)中對(duì)象保活

開發(fā) 前端
您可能希望將this指針捕獲到c++ lambda中,但這將捕獲原始指針。如果需要延長(zhǎng)對(duì)象的生命周期,則需要捕獲強(qiáng)引用。“捕獲對(duì)自己的強(qiáng)引用”的常見模式是同時(shí)捕獲強(qiáng)引用和原始this。強(qiáng)引用保持this為活的,并且使用this方便訪問(wèn)成員。

概念

  • 類模板 std::function 是通用多態(tài)函數(shù)包裝器。 std::function 的實(shí)例能存儲(chǔ)、復(fù)制及調(diào)用任何可復(fù)制構(gòu)造(CopyConstructible)可調(diào)用(Callable)目標(biāo)——函數(shù)、 lambda 表達(dá)式、 bind 表達(dá)式或其他函數(shù)對(duì)象,還有指向成員函數(shù)指針和指向數(shù)據(jù)成員指針。
  • std::enable_shared_from_this 能讓其一個(gè)對(duì)象(假設(shè)其名為 t ,且已被一個(gè) std::shared_ptr 對(duì)象 pt 管理)安全地生成其他額外的 std::shared_ptr 實(shí)例(假設(shè)名為 pt1, pt2, ... ) ,它們與 pt 共享對(duì)象 t 的所有權(quán)。

例子1

您可能希望將this指針捕獲到c++ lambda中,但這將捕獲原始指針。如果需要延長(zhǎng)對(duì)象的生命周期,則需要捕獲強(qiáng)引用。“捕獲對(duì)自己的強(qiáng)引用”的常見模式是同時(shí)捕獲強(qiáng)引用和原始this。強(qiáng)引用保持this為活的,并且使用this方便訪問(wèn)成員。

#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

在線測(cè)試

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


責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2010-02-04 16:07:39

C++回調(diào)函數(shù)

2023-01-03 13:30:14

C++代碼map

2022-10-24 08:03:04

MySQL數(shù)據(jù)庫(kù)

2010-01-21 10:23:53

C++代碼

2011-06-15 11:05:14

C語(yǔ)言回調(diào)函數(shù)

2009-08-19 16:40:35

C#回調(diào)

2009-08-12 10:11:18

C# 回調(diào)函數(shù)

2010-01-20 09:48:44

面向?qū)ο?/a>

2021-06-07 09:44:10

JavaScript開發(fā)代碼

2010-03-17 08:49:49

Visual Stud

2009-08-19 17:10:09

C#回調(diào)函數(shù)

2025-03-24 07:20:00

2023-11-10 16:31:31

2010-01-20 18:24:51

C++CLI

2023-10-30 10:29:50

C++最小二乘法

2009-07-31 16:25:29

C#回調(diào)函數(shù)API應(yīng)用

2010-01-21 09:34:57

C++語(yǔ)法

2010-01-27 16:05:06

C++堆棧

2011-06-21 10:17:41

c++內(nèi)存模型

2010-02-03 14:18:44

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 手机在线一区二区三区 | 91在线视频一区 | www日韩欧美 | 青春草91 | 亚洲电影一级片 | 久久久久国产精品免费免费搜索 | www国产成人免费观看视频,深夜成人网 | 欧美激情免费在线 | 久久久久久中文字幕 | 在线国产一区 | 国产传媒视频在线观看 | 成人动漫一区二区 | 国产精品一区一区 | 日日干日日操 | 最新av中文字幕 | 超碰av免费 | 日本网站在线看 | 中文字幕av第一页 | 国产高清一区二区 | 国产激情在线观看视频 | 玖玖精品 | 四虎影院新地址 | 亚洲国产成人精品久久久国产成人一区 | 亚洲xx在线| 理论片87福利理论电影 | 美女131mm久久爽爽免费 | 一区欧美| 国产福利视频 | 自拍偷拍精品 | 精品在线 | 天天干夜夜操 | 天天干天天玩天天操 | 观看av| 在线看一区二区 | 国产特级毛片aaaaaa喷潮 | 日韩欧美在 | 日韩在线91 | 99精品电影 | 精品1区| 91www在线观看 | 97国产精品视频 |