(原创)一个和c#中LazyT类似的c++ LazyT类的实现

  在.net 4.0中增加一个延迟加载类Lazy<T>,它的作用是实现按需延迟加载,也许很多人用过。一个典型的应用场景是这样的:当初始化某个对象时,该对象引用了一个大对象,需要创建,这个对象的创建时需要较长的时间,同时也需要在托管堆上分配较多的空间,这样可能会在初始化时变得很慢,尤其是UI应用时,会导致用户体验很差。其实狠多时候并不需要马上就获取大数据,只是在需要时获取,这种场景就很适合延迟加载了。先看看c#中Lazy<T>如何使用的吧:

class LargeObject
{public int InitializedBy { get { return initBy; } }int initBy = 0;public LargeObject(int initializedBy){initBy = initializedBy;Console.WriteLine("LargeObject was created on thread id {0}.", initBy);}public long[] Data = new long[100000000];
}
class TestLazy
{Lazy<LargeObject> lazyLargeObject = null;public TestLazy(){//创建一个延迟加载对象lazyLargeObject = new Lazy<LargeObject>(InitLargeObject);}public void ReallyLoad(){//此时真正加载
        lazyLargeObject.Value;Console.WriteLine("lazy load big object");//do something
    }
}void Test()
{TestLazy t = new TestLazy();t.ReallyLoad(); //这时,真正延迟加载时才会打印"lazy load big object"
}

  

  c++中目前还没有类似的Lazy<T>延迟加载类,其实延迟加载类内部用到了lamda表达式,将函数封装到lamda表达式中去,而不是马上求值,而是在需要的时候再调用lamda表达式去求值。c++11 中有lamda表达式和function,正好做这个事情,看看c++11如何实现类似c#的Lazy<T>延迟加载类吧。

#include <boost/optional.hpp>
template<typename T>
struct Lazy
{Lazy(){}template <typename Func, typename... Args>Lazy(Func& f, Args && ... args){m_func = [&f, &args...]{return f(args...); };}T& Value(){if (!m_value.is_initialized()){m_value = m_func();}return *m_value;}bool IsValueCreated() const{return m_value.is_initialized();}private:std::function<T()> m_func;boost::optional<T> m_value;
};template<class Func, typename... Args>
Lazy<typename std::result_of<Func(Args...)>::type>lazy(Func && fun, Args && ... args)
{return Lazy<typename std::result_of<Func(Args...)>::type>(std::forward<Func>(fun), std::forward<Args>(args)...);
}

再看看测试代码:

struct BigObject
{BigObject(){cout << "lazy load big object" << endl;}
};struct MyStruct
{MyStruct(){m_obj = lazy([]{return std::make_shared<BigObject>(); });}void Load(){m_obj.Value();}Lazy< std::shared_ptr<BigObject>> m_obj;
};int Foo(int x)
{return x * 2;
}void TestLazy()
{//带参数的普通函数int y = 4;auto lazyer1 = lazy(Foo, y);cout << lazyer1.Value() << endl;//不带参数的lamdaLazy<int> lazyer2 = lazy([]{return 12; });cout << lazyer2.Value() << endl;//带参数的fucntionstd::function < int(int) > f = [](int x){return x + 3; };auto lazyer3 = lazy(f, 3);cout << lazyer3.Value() << endl;//延迟加载大对象
    MyStruct t;t.Load();
}

输出结果:

8
12
6
lazy laod big object

 

  这个Lazy<T>类可以接收lamda表达式和function,实现按需延迟加载。和c#的Lazy<T>用法类似。不过还没c#中Laze<T>那么强大,没有增加线程策略在里面,目前还不想做得更复杂,简单够用就行。


c++11 boost技术交流群:296561497,欢迎大家来交流技术。

转载于:https://www.cnblogs.com/qicosmos/p/3388704.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网页选项卡的应用

&#xff08;1&#xff09;功能描述&#xff1a; 在页面中&#xff0c;设置三个不同名称的选项卡&#xff0c;当单机某个选项卡时&#xff0c;下面相对应的区域显示其内容信息&#xff0c;同时选项卡的背景色与内容信息的背景色浑然一体&#xff0c;并且字体加粗&#xff0c;表…

python 爬虫-beautifulsoup4

利用它可以不用编写正则表达式即可方便的实现网页信息的提取。 pip3 install beautifulsoup4 用法讲解&#xff1a;常用解析库&#xff1a; lxml HTML解析器 lxml XML解析器 from bs4 import BeautifulSoup soup BeautifulSoup(html,lxml) print(soup.prettify()) #格式化代…

魔兽控制命令ID

来源:http://tieba.baidu.com/p/1084211586本次技能ID大全共收录ID368条不包括重复的ID&#xff0c;物品类技能的ID使用必须将物品技能单独抽离出来并设置“物品技能false”&#xff0c;拥有命令字符串的物品请参考拥有相同字符串的4族中立技能。P.S所有ID都是按照从小到大的顺…

python爬虫框架--scrapy 基本使用

流程框架&#xff1a; 1、抓取第一页&#xff1a;请求第一页的URL并得到源代码&#xff0c;进行下一步分析。 2、获取内容和下一页链接&#xff1a;分析源代码&#xff0c;提取首页内容&#xff0c;获取下一页链接等待进一步爬取。 3、保存爬取结果&#xff1a;将爬取结果保存为…

jsp页面的使用

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//1.获取资源文件 InputStream isthis.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties"); Str…

python爬虫安装错误与解决方式

# 安装错误&#xff1a; error:Microsoft Visual C 14.0 is required... 下载地址&#xff1a;http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted pip install xxx.whl # 运行错误 1&#xff1a; from .. Import etree ImportError:DLL load failed pip uninstall lx…

工欲善其事必先利其器系列之:在VS里面折叠js代码

之前用vs写js的时候经常因为js代码过长而且不能像cs文件里面的方法一样进行折叠而抓狂,直到在扩展库发现了这款插件有了它就可以把代码进行折叠了 插件地址转载于:https://www.cnblogs.com/Chendaqian/p/3396702.html

python- 基础 map方法

python中map()函数 map()是 Python 内置的高阶函数&#xff0c;它接收一个函数 f 和一个 list&#xff0c;并通过把函数 f 依次作用在 list 的每个元素上&#xff0c;得到一个新的 list 并返回。 例如&#xff0c;对于list [1, 2, 3, 4, 5, 6, 7, 8, 9] 如果希望把list的每个…

C算法编程题(二)正螺旋

前言 上一篇《C算法编程题&#xff08;一&#xff09;扑克牌发牌》 写东西前总是喜欢吐槽一些东西&#xff0c;还是多啰嗦几句吧&#xff0c;早上看了一篇博文《谈谈外企涨工资那些事》&#xff0c;里面楼主讲到外企公司包含的五类人&#xff0c;其实不只是外企如此&#xff0c…

同时获取同一等级下多个class值的节点的方法

方法&#xff1a; tr_ soup.find("div", class_"mod_cont fcolor30").find_all("tr", attrs{"class":["md_tr font14 bgcolor-s","md_tr font14 bgcolor"]}) 同时获取两个不同的class.例如&#xff1a; 当Beauti…

【循序渐进学Python】6.Python中的函数

1. 创建函数 一个函数代表一个行为并且返回一个结果(包括None)&#xff0c;在Python中使用def关键字来定义一个函数&#xff0c;如下&#xff1a; def hello(name):print hello, name ! 接下来调用函数&#xff0c;并查看其返回值&#xff1a; # output: # hello,gy! # None …

求子数组的最大和

穷举法&#xff1a; int MaxSubArraySum(int a[], int n) { int i, j, MaxSum 0, tmpSum, cnt; for (i1; i<n; i) { for (j0; ji<n; j) { cnt 0; tmpSum 0; while (cnt < i) { tmpSum a[jcnt]; cnt; } if (MaxSum < tmpSum) { MaxSum tmpSum; } } } return Ma…

scrapy框架-post使用

scrapy中使用FormRequest向网页提交数据 Scrapy post使用 如何post data&#xff1a; http://httpbin.org/post FormRequest : post请求 GitHub Login 借助浏览器分析登陆行为。 分析post的内容先尝试一次错误的登陆&#xff1a;如下&#xff1a;分析&#xff1a;需要post…

duilib进阶教程 -- 改进窗口拖动 (12)

现在大家应该都知道caption"0,0,0,32"&#xff0c;是指示标题栏区了吧&#xff0c;如果想要整个窗口都能拖动呢&#xff1f; 那直接把高度改成和窗口一样不就得了~O(∩_∩)O~ 嗯&#xff0c;这样是可以&#xff0c;比如窗口高度是600&#xff0c;那么我们指定caption…

python- 基础 range方法的使用

1、第一种用法 index[1,2,0,5,9,8,10,6,4,7] for i in range(len(index)): print(index[i]) 结果&#xff1a; λ py test.py 1 2 0 5 9 8 10 6 4 7 2、第二种用法&#xff1a; index[1,2,0,5,9,8,10,6,4,7] for i in range(0,len(index),2): print(index[i]) 运…

Oracle行列转换小结

目录结构如下&#xff1a;行转列列转行[一]、行转列 1.1、初始测试数据 表结构&#xff1a;TEST_TB_GRADE Sql代码 create table TEST_TB_GRADE ( ID NUMBER(10) not null, USER_NAME VARCHAR2(20 CHAR), COURSE VARCHAR2(20 CHAR), SCORE FLOAT ) 初始…

python- 进阶 与flask的搭配使用---定时任务框架APScheduler学习详解

APScheduler简介 在平常的工作中几乎有一半的功能模块都需要定时任务来推动&#xff0c;例如项目中有一个定时统计程序&#xff0c;定时爬出网站的URL程序&#xff0c;定时检测钓鱼网站的程序等等&#xff0c;都涉及到了关于定时任务的问题&#xff0c;第一时间想到的是利用ti…

Mingw下g++编译执行顺序错误

今天写一个简单的线性表时&#xff0c;用Mingw中的g编译、调试、运行时发现一个奇怪的现象&#xff1a;程序的执行顺序与实际编写顺序不一致。 编译环境&#xff1a;代码编写 win7下 editplus Mingw 4.3.3 g 代码片段如下&#xff1a; 1 //function: create a list 2 //ti…

python系统学习1-程序设计的基本方法

一、程序设计基本方法 计算机与程序设计 编译和解释 程序的基本编写方法 计算机编程 1、计算机与程序设计 &#xff08;1&#xff09;、计算机是根据指令操作数据的设备 功能性&#xff1a;对数据的操作、表现为数据计算、输出输入处理和结果存储。 可编程性&#xff1a;…

python 系统学习实例1.1 - 华氏度与摄氏度的转换

# C ( F - 32 ) / 1.8‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬ # F C * 1.8 32‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫…