首页 > 编程语言 >[c++11新特性]08-defer的实现

[c++11新特性]08-defer的实现

时间:2022-12-06 17:06:08浏览次数:63  
标签:11 defer function 08 std __ action include

defer 的实现

  • ​​defer的实现​​

在go语言中有一个关键字 defer 可以用来指示当程序跳出某一作用域的时候执行指定的操作。假定C++中也定义了defer操作,则以下代码将产生对应的操作:

#include <iostream>
#include <function>

void func()
{
std::cout << "defer:func()" << std::endl;
}

class scope
{
public:
void print(){
std::cout << "defer:scope()" << std::endl;
}
};

int main()
{
defer func;
defer [](){
std::cout << "defer:lambda()" << std::endl;
};

{
scope tmp;
defer [=](){
tmp.print();
};
}

// defer:scope()
// defer:lambda()
// defer:func()
return 0;
}

defer的实现

defer的实现借助于C++的以下特性:

  • std::function
  • 模板的完美转发
  • RAII:对象销毁的时候调用该对象的析构函数
  • 类的operator重载操作

另外,为了方便创建对象,还使用了宏来创建对象。

#include <functional>
#include <iostream>
#include <string>

// https://blog.csdn.net/cai6811376/article/details/103497566

#define _DEFER_CONNECT(x, y) x##y
#define _DEFER_CREATE_(x, y) _DEFER_CONNECT(x, y)

// auto __defer__line__ = create_defer() + xxx;
// create_defer(): 创建一个匿名对象,然后调用operator+生成一个 __defer_action 对象
#define defer auto _DEFER_CREATE_(__defer__, __LINE__) = create_defer() +
#define defer_scope defer[&]

struct __defer_action
{
std::function<void()> _function;

template <class T>
__defer_action(T &&f) : _function(std::forward(f)) {}

__defer_action(__defer_action &&f) : _function(std::move(f._function)) {}

__defer_action &operator=(__defer_action &&rhs) noexcept
{
_function = std::move(rhs._function);
return *this;
}

~__defer_action()
{
if (_function)
{
_function();
}
}
};

struct create_defer
{
template <class T>
__defer_action operator+(T &&f)
{
return __defer_action{std::forward(f)};
}
};

int main()
{
int i = 0;
defer[&]()
{
std::cout << "i = " << ++i << std::endl;
};

defer_scope
{
i++;
};

return 0;
}

标签:11,defer,function,08,std,__,action,include
From: https://blog.51cto.com/u_6650004/5916387

相关文章

  • [c++11新特性]09-chrono的使用与封装
    时间类的简介​时间类的简介​​​duration简介​​​​借助chrono实现的定时器​​​​time_point​​​时间类的封装​​​时间格式化​​​​日期变化​​duration简......
  • 段码LCD液晶显示驱动IC-VK1088B 超小体积4*4MM 22*4点LCD液晶驱动,FAE技术支持
    产品品牌:永嘉微电/VINKA产品型号:VK1088B封装形式:QFN32(4MM*4MM) 概述:VK1088B是一个点阵式存储映射的LCD驱动器,可支持最大88点(22SEGx4COM)的LCD屏,也支持2COM和3COM......
  • 300011 绝对标高和相对标高
    <?phpheader('Content-Type:text/html;charset=utf-8');define('ROOT',$_SERVER['DOCUMENT_ROOT']);includeROOT.'/assets/php/head.php';$tit='绝对标高和相对......
  • [c++11新特性]02-模板优化
    模板优化​模板优化​​​模板别名​​​​默认模板参数​​​​外部模板​​模板别名在了解类型别名模板之前,需要理解『模板』和『类型』之间的不同。仔细体会这句话:模板是......
  • [c++11新特性]07-可变参模板
    可变参模板​​可变参数模板​​​可变参模板​​​简介​​​​递归模板函数​​简介可变参模板是c++11引入的特别重要的一个特性,和c语言中的可变参一样,也是使用...来......
  • W11中使用VScode远程开发之宝塔用户自动登录
    宝塔面板开启ssh,加密方式选择rsa下载秘钥,放值目录:C:\Users\本机用户\.ssh修改该目录下的config文件Host111.112.113.114HostName111.112.113.114UserrootF......
  • Oracle错误——ORA-03113:通信通道的文件结尾 解决办法
    该错误我是还原数据库之后出现的建议的问题跟进方法是先查看oracle的日志,查看的方法select*fromv$diag_info 先看日志文件存储在哪,根据路径找到文件查看文件内容......
  • Semaphore信号量源码解析(基于jdk11)
    目录1、Semaphore信号量源码解析(基于jdk11)1.1Semaphore概述1.2Semaphore的原理1.2.1基本结构(jdk11)1.2.2可中断获取信号量1.2.3公平模式1.2.4非公平模式1.2.4不......
  • CyclicBarrier循环屏障源码解析(基于jdk11)
    目录CyclicBarrier循环屏障源码解析(基于jdk11)1.1CyclicBarrier概述1.2CyclicBarrier原理1.2.1基本结构(jdk11)1.2.2await()方法1.2.3dowait方法1.2.3.1breakBarrie......
  • Newsletter 2022-11|HStreamDB 0.11 发布
    11月我们发布了HStreamDB0.11,修复了多项已知问题。同时也在继续推进HStreamPlatform的开发,并计划于本月底上线首个Alpha版本。v0.11发布随着云原生流数据库​​HSt......