今天在网上看到一个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__的可调用类 装饰器可以去装饰谁(谁可以被装饰): 函 ...
随机推荐
-
题解西电OJ (Problem 1008 - 数星星)
题目内容: Description “不要问我太阳有多高 我会告诉你我有多真 不要问我星星有几颗 我会告诉你很多很多” 一天Qinz和wudired在天上数星星,由于星星可以排列成一条直线,他们比赛看 ...
-
html5 vedio 播放器,禁掉进度条快进快退事件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
-
linux抓包工具Charles的配置安装
1. 安装 (不赘述,方法很多,我使用yaourt charles安装) 2. 导出证书,crt格式保存备用 3. 浏览器导入证书 4. 浏览器设置代理
-
转载:Quartz.NET 入门
分享自:http://www.cnblogs.com/jys509/p/4628926.html 概述 Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮 ...
-
【.NET架构】BIM软件架构01:Revit插件产品架构梳理
一.前言 BIM:Building Information Modeling 建筑信息模型,就是将建筑的相关信息附着于模型中,以管理该建筑在设计.算量.施工.运维全生命周期的情况.创建模 ...
-
hover设定触发时间间隔
500毫秒执行一次 $(".banner_menu_content li a").hover(function(){ var aa=$(this).text().trim(); s ...
-
vs 加载 dll 缓慢
https://jingyan.baidu.com/article/642c9d34e25cc2644b46f74b.html http://www.it610.com/article/2611781 ...
-
Bzoj5251 线段树+贪心
Bzoj5251 线段树+贪心 记录本蒟蒻省选后的第一篇题解!国际惯例的题面:首先这个东西显然是一棵树.如果我们把数值排序,并建立这棵树的dfs序,显然dfs序上的一个区间对应数值的一个区间,且根为数 ...
-
Shiro系列(2) - 权限模型以及权限分配的两种方式
1. *账户分配权限用户需要被分配相应的权限才可访问相应的资源.权限是对于资源的操作一张许可证.给用户分配资源权限需要将权限的相关信息保存到数据库.这些相关内容包含:用户信息.权限管理.用户分配的权 ...
-
苹果 重置APPID密保问题及更新开发者协议
[链接]重置AppleID密保问题 https://www.jianshu.com/p/37e7f2852eda [链接]苹果开发者计划许可协议更新:持续更新 https://www.jianshu. ...