C++项目中怎么实现闭包

今天就跟大家聊聊有关C++项目中怎么实现闭包,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

创新互联建站成都网站建设按需制作,是成都营销推广公司,为搅拌罐车提供网站建设服务,有成熟的网站定制合作流程,提供网站定制设计服务:原型图制作、网站创意设计、前端HTML5制作、后台程序开发等。成都网站维护热线:18982081108

示例

#include 
#include 

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

    virtual void Run() = 0; //纯虚函数
};

template 
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 
Closure* NewCallback(void(*function)(Arg1), Arg1 arg1) {
    return new FunctionClosure1(function, arg1);
}

// 带一个参数的函数
template
void foo(type data) 
{
    std::cout << "foo data=" << data << std::endl;
}

int main()
{
    Closure* closure;
    closure = NewCallback(foo, std::string("titus"));
    //等价于 closure = new FunctionClosure1(foo, 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 std_closure=foo;
std_closure(string("test std"));

使用 lambda 表达式

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

看完上述内容,你们对C++项目中怎么实现闭包有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。


分享文章:C++项目中怎么实现闭包
文章转载:http://scyanting.com/article/jiodop.html