91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++項目中怎么實現閉包

發布時間:2021-07-06 17:20:13 來源:億速云 閱讀:143 作者:Leah 欄目:云計算

今天就跟大家聊聊有關C++項目中怎么實現閉包,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

示例

#include <iostream>
#include <string>

class Closure {
public:
    Closure() {}
    ~Closure() {}

    virtual void Run() = 0; //純虛函數
};

template <typename Arg1>
class FunctionClosure1 : public Closure {
public:
    typedef void (*FunctionType)(Arg1);

    FunctionClosure1(FunctionType f, Arg1 arg1) :
        _f(f),
        _arg1(arg1) {
        }
    ~FunctionClosure1() {
    }

    virtual void Run() {
        _f(_arg1);
        delete this;
    }
private:
    FunctionType _f;
    Arg1 _arg1;
};

template <typename Arg1>
Closure* NewCallback(void(*function)(Arg1), Arg1 arg1) {
    return new FunctionClosure1<Arg1>(function, arg1);
}

// 帶一個參數的函數
template<typename type>
void foo(type data) 
{
    std::cout << "foo data=" << data << std::endl;
}

int main()
{
    Closure* closure;
    closure = NewCallback(foo<std::string>, std::string("titus"));
    //等價于 closure = new FunctionClosure1<std::string>(foo<std::string>, std::string("titus"));
    closure->Run();
    //自己釋放 delete closure
    return 0;
}

Closure 定義為純虛類,不能實例化,必須由子類實現它的虛函數后再才能實例化。

FunctionClosure1 為 Closure 的子類,定義為模版類,可以定制傳入參數的類型。它有兩個私有成員,函數指針成員 _f,參數 _arg1,在成員方法 Run 中會讓函數 _f 傳入參數 _arg1 進行調用。而函數指針成員是在類初始化時傳入的,相當于函數也是可以定制的。運行完之后 delete this,這是因為 NewCallback 在堆上 new 了一個對象,這里自動進行資源釋放,當然也可以自己釋放。

NewCallback 是一個輔助函數,用來生成子閉包類,它需要傳入函數指針和參數。

在使用時,父指針指向 NewCallback創建的子類,同時傳入函數指針和參數,最后調用子類繼承實現的 Run 方法。

這么看來,閉包可以看成是對回調函數的封裝。

標準庫寫法

頭文件引入 functional 標準庫,用 C++11 的寫法也可以實現上述例子

std::function<void(string)> std_closure=foo;
std_closure(string("test std"));

使用 lambda 表達式

std::function<void()> std_closure = []() {foo(string("test lambda"));};
std_closure();

看完上述內容,你們對C++項目中怎么實現閉包有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節
推薦閱讀:
  1. Python 閉包
  2. lua 閉包

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

阳曲县| 安西县| 安泽县| 双流县| 白玉县| 安徽省| 三河市| 澄迈县| 文昌市| 平利县| 东山县| 宜川县| 宁乡县| 马龙县| 当涂县| 耒阳市| 柳州市| 土默特左旗| 海盐县| 安阳市| 唐山市| 武强县| 延寿县| 辽宁省| 丰镇市| 章丘市| 武冈市| 翼城县| 贞丰县| 泉州市| 象山县| 长兴县| 嘉善县| 南木林县| 揭西县| 图们市| 清流县| 策勒县| 木里| 普陀区| 深水埗区|