欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

C++項(xiàng)目中怎么實(shí)現(xiàn)閉包

今天就跟大家聊聊有關(guān)C++項(xiàng)目中怎么實(shí)現(xiàn)閉包,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

創(chuàng)新互聯(lián)建站成都網(wǎng)站建設(shè)按需制作,是成都營(yíng)銷推廣公司,為攪拌罐車提供網(wǎng)站建設(shè)服務(wù),有成熟的網(wǎng)站定制合作流程,提供網(wǎng)站定制設(shè)計(jì)服務(wù):原型圖制作、網(wǎng)站創(chuàng)意設(shè)計(jì)、前端HTML5制作、后臺(tái)程序開(kāi)發(fā)等。成都網(wǎng)站維護(hù)熱線:18982081108

示例

#include <iostream>
#include <string>

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

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

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);
}

// 帶一個(gè)參數(shù)的函數(shù)
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"));
    //等價(jià)于 closure = new FunctionClosure1<std::string>(foo<std::string>, std::string("titus"));
    closure->Run();
    //自己釋放 delete closure
    return 0;
}

Closure 定義為純虛類,不能實(shí)例化,必須由子類實(shí)現(xiàn)它的虛函數(shù)后再才能實(shí)例化。

FunctionClosure1 為 Closure 的子類,定義為模版類,可以定制傳入?yún)?shù)的類型。它有兩個(gè)私有成員,函數(shù)指針成員 _f,參數(shù) _arg1,在成員方法 Run 中會(huì)讓函數(shù) _f 傳入?yún)?shù) _arg1 進(jìn)行調(diào)用。而函數(shù)指針成員是在類初始化時(shí)傳入的,相當(dāng)于函數(shù)也是可以定制的。運(yùn)行完之后 delete this,這是因?yàn)?NewCallback 在堆上 new 了一個(gè)對(duì)象,這里自動(dòng)進(jìn)行資源釋放,當(dāng)然也可以自己釋放。

NewCallback 是一個(gè)輔助函數(shù),用來(lái)生成子閉包類,它需要傳入函數(shù)指針和參數(shù)。

在使用時(shí),父指針指向 NewCallback創(chuàng)建的子類,同時(shí)傳入函數(shù)指針和參數(shù),最后調(diào)用子類繼承實(shí)現(xiàn)的 Run 方法。

這么看來(lái),閉包可以看成是對(duì)回調(diào)函數(shù)的封裝。

標(biāo)準(zhǔn)庫(kù)寫(xiě)法

頭文件引入 functional 標(biāo)準(zhǔn)庫(kù),用 C++11 的寫(xiě)法也可以實(shí)現(xiàn)上述例子

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

使用 lambda 表達(dá)式

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

看完上述內(nèi)容,你們對(duì)C++項(xiàng)目中怎么實(shí)現(xiàn)閉包有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

名稱欄目:C++項(xiàng)目中怎么實(shí)現(xiàn)閉包
瀏覽地址:http://chinadenli.net/article8/jiodop.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、軟件開(kāi)發(fā)搜索引擎優(yōu)化、靜態(tài)網(wǎng)站虛擬主機(jī)、網(wǎng)站營(yíng)銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)

網(wǎng)站設(shè)計(jì)公司知識(shí)