C++函数装饰器
今天在网上看到一个python实现的函数装饰器,尝试用C++11实现了一下,最后很粗糙的完成了,代码如下。
函数装饰器:接受一个函数。将此函数进行一些装饰,成为另一个函数。新生产的函数具有原函数的功能,另外还会做一些其他的功能。返回新函数。

由于Python中一切皆对象,把类型也当成对象看待,把函数的参数和返回值也当成对象看待,所以很容易就实现出来。而c++是一门静态类型语言,编译器做类型检查,执行期间没有类型相关的信息(除了RTTI)。所以实现起来比较麻烦,只能使用模板、函数指针、可变参数、函数对象、lambad等知识实现。而类装饰器就更难了。
最近还听说Go语言使用协程实现线程库,也是醉了。比我还奇葩。
#include <iostream>
#include <functional>
#include <stdarg.h>
void do_previous_work() {/*do some thing*/}
void do_after_work() {/*do some thing*/ }
//函数装饰器:输入一个函数,将此函数包装后返回包装后的函数,函数类型不变。
template<typename FUN_RESULT, typename ... FUN_ARGS>
std::function<FUN_RESULT(FUN_ARGS ... args)> decorator(FUN_RESULT(*p_func)(FUN_ARGS ... args))
{
auto post = [&](FUN_ARGS ... args) -> FUN_RESULT {
do_previous_work();
FUN_RESULT result = (*p_func)(args...);
do_after_work();
return result;
};
return post;
}
//思考:类包装器,将类包装后,类的每一个成员函数都被装饰器装饰。
int test(int a, double b) { return a+b; }
int main() {
int a = 1;
double b = 2;
auot f = decorator(test);//传入函数入口地址,返回装饰后的函数对象。
f(a, b);
system("pause");
return 0;
}
C++函数装饰器的更多相关文章
- Python高手之路【四】python函数装饰器
def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...
- Python: 无参数的函数装饰器
写带参数的函数装饰器最纠结的是需要包好多层,最外层是接收参数的函数,它返回一个接收函数的的函数.但这样有个问题是,最终包装出来的装饰器必须加()调用一下,即使没有参数也需要这样做,因为调用这个最外层函 ...
- Python中利用函数装饰器实现备忘功能
Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下 " ...
- 【Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数】
一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(Firs ...
- python 函数 装饰器 内置函数
函数 装饰器 内置函数 一.命名空间和作用域 二.装饰器 1.无参数 2.函数有参数 3.函数动态参数 4.装饰器参数 三.内置函数 salaries={ 'egon':3000, 'alex':10 ...
- python基础—函数装饰器
python基础-函数装饰器 1.什么是装饰器 装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能. 装饰器的返回值是也是一个函数对象. 装饰器经常用于有切 ...
- Python档案袋(函数与函数装饰器 )
特点:代码复用.可扩展.保持一致性 函数简单的实现,返回值的不同: #定义方法 def funx1(): pass def funx2(): return 0 def funx3(): return ...
- python 修改的函数装饰器
把好的代码记录下来 方便以后学习 修改的函数参数装饰器 from functools import wraps import time import logging def warn(timeout) ...
- python装饰器1:函数装饰器详解
装饰器1:函数装饰器 装饰器2:类装饰器 装饰器3:进阶 先混个眼熟 谁可以作为装饰器(可以将谁编写成装饰器): 函数 方法 实现了__call__的可调用类 装饰器可以去装饰谁(谁可以被装饰): 函 ...
随机推荐
- Mybatis第一天
Mybatis第一天 框架课程 1. 课程计划 第一天: 1.Mybatis的介绍 2.Mybatis的入门 a) 使用jdbc操作数据库存在的问题 b) Mybatis ...
- servlet获取request数据的乱码解决
例如请求中有: /score?type=Mana&name=${user.name} ***************************************************** ...
- css a的伪类顺序
a:link {color: #FF0000} /* 未访问的链接 */ a:visited {color: #00FF00} /* 已访问的链接 */ a:hover {color: #FF00FF ...
- Zabbix增加邮箱后Server宕处理
zabbix版本:4.1 DB为Mysql 过程: 1,为了增加邮件报警功能,按照网上文章,开始增加发送邮件模块.先停postfix,后安装mailx和sendmail. systemctl lis ...
- mysql建表时
问题:Incorrect column specifier for column 'id' 答案:原来自动增长列用int数据类型,不用varchar
- java常用类( 下 )
- 牛客练习赛 43 B-Tachibana Kanade Loves Probability
链接:https://ac.nowcoder.com/acm/contest/548/B 题目描述 立华奏在学习初中数学的时候遇到了这样一道大水题: “设箱子内有 n 个球,其中给 m 个球打上标记, ...
- chrome console.log失效
把红框里的内容去掉就可以了 那个框是过滤..
- python-2018.03.03
本周用python实现了 1.通过svn模块检出远程代码到本地(ps:修改了windows svn的一个编码模块的小bug),并通过调用MSbuild 编译.发布并打包发布后的代码 (注:以上需要安装 ...
- c语言——鞍点
描述 找出具有m行n列二维数组Array的“鞍点”,即该位置上的元素在该行上最大,在该列上最小,其中1<=m,n<=10. 输入 输入数据有多行,第一行有两个数m和n,下面有m行,每行有n ...