folly学习(一)C中如何实现一个通用迭代器
folly中实现了一个通用的迭代器,位于follydetailIterators。h
通用迭代器一般由两部分组成,类型声明和操作符重载类型声明
因为迭代器主要作用,是被算法调用,所以需要告诉算法,我有什么,并且它们的类型名字都是统一规定好的templateclassD,classV,classTagclassIteratorFacade{public:1、第一部分类型声明usingvaluetypeV;迭代器所指向的变量的类型usingreferencevaluetype;迭代器所指向的变量的引用类型usingpointervaluetype;迭代器所指向的变量的指针类型usingdifferencetypessizet;用来表示两个迭代器的距离usingiteratorcategoryTag;迭代器类型}
上述类模板中的模板参数:D:表示继承该类的子类(CRTP)V:迭代器所指向的变量类型Tag:迭代器类型:
std::forwarditeratortag
std::bidirectionaliteratortag
其中CRTP表示静态多态,静态多态最大的作用是,父类可以调用子类的函数。主要通过下面这一函数来实现:DasDerived(){returnstaticcastD(this);}
在上述函数中staticcastD(this)将该类转化成了子类的引用,从而使得该类能够调用子类的函数。操作符重载
对于一般的指针来说,一共有8个操作符需要重载:
!后置前置后置前置templateclassD,classV,classTagclassIteratorFacade{public:1、第一部分类型声明usingvaluetypeV;迭代器所指向的变量的类型usingreferencevaluetype;迭代器所指向的变量的引用类型usingpointervaluetype;迭代器所指向的变量的指针类型usingdifferencetypessizet;用来表示两个迭代器的距离usingiteratorcategoryTag;迭代器类型2、第二部分操作符重载equal(lhs,rhs)中使用了子类的boolequal(Dconstrhs)const;函数friendbooloperator(Dconstlhs,Dconstrhs){returnequal(lhs,rhs);}friendbooloperator!(Dconstlhs,Dconstrhs){return!(lhsrhs);}使用了子类的referencedereference()const;函数Voperator()const{returnasDerivedConst()。dereference();}Voperator()const{returnstd::addressof(operator());}使用了子类的voidincrement();函数Doperator(){asDerived()。increment();returnasDerived();}Doperator(int){autoretasDerived();copyasDerived()。increment();returnret;}使用了子类的voiddecrement();函数Doperator(){asDerived()。decrement();returnasDerived();}Doperator(int){autoretasDerived();copyasDerived()。decrement();returnret;}private:将父类转化为子类DasDerived(){returnstaticcastD(this);}DconstasDerivedConst()const{returnstaticcastDconst(this);}staticboolequal(Dconstlhs,Dconstrhs){returnlhs。equal(rhs);}};
使用的时候只要继承该类,并且实现以下四个方法voidincrement();voiddecrement();optional,tobeusedwithbidirectionalreferencedereference()const;boolequal(〔appropriateiteratortype〕constrhs)const;使用示例
第一步、继承父类,指定父类模板中的模板参数structIntArrayIterator:IteratorFacadeIntArrayIterator,intconst,std::forwarditeratortag{}
其中:IntArrayIterator:表示将自身的类型传给父类,使得父类能够调用子类的函数intconst:表示变量类型std::forwarditeratortag:表示迭代器类型
第二步、添加构造函数和成员变量structIntArrayIterator:IteratorFacadeIntArrayIterator,intconst,std::forwarditeratortag{intconsta;explicitIntArrayIterator(intconsta):a(a){}};
第三步、添加父类中调用的四个函数,因为这是个前向迭代器,所以实现实现三个函数就行structIntArrayIterator:IteratorFacadeIntArrayIterator,intconst,std::forwarditeratortag{explicitIntArrayIterator(intconsta):a(a){}voidincrement(){a;}intconstdereference()const{returna;}boolequal(IntArrayIteratorconstrhs)const{returnrhs。aa;}intconsta;};
测试includeincludecassertincludeiostreaminclude。。follydetailIterators。husingnamespacefolly::detail;usingnamespacefolly;namespace{structIntArrayIterator:IteratorFacadeIntArrayIterator,intconst,std::forwarditeratortag{explicitIntArrayIterator(intconsta):a(a){}voidincrement(){a;}intconstdereference()const{returna;}boolequal(IntArrayIteratorconstrhs)const{returnrhs。aa;}intconsta;};}namespaceintmain(){usingTRstd::iteratortraitsIntArrayIterator;staticassert(std::issameTR::valuetype,intconst::value,);staticassert(std::issameTR::reference,intconst::value,);staticassert(std::issameTR::pointer,intconst::value,);staticassert(std::issameTR::iteratorcategory,std::forwarditeratortag::value,);staticassert(std::issameTR::differencetype,ssizet::value,);staticconstautokArraystd::arrayint,3{42,43,44};IntArrayIteratorend(kArray。data()kArray。size());IntArrayIteratoriter(kArray。data());assert(iter!end);assert(42iter);iter;assert(iter!end);assert(43iter);iter;assert(iter!end);assert(44iter);iter;assert(iterend);}
美系电动车混战电动野马对比ModelY,谁更香?自从纯电动车诞生后,汽车制造就不再局限在传统车企,科技企业的跨界给汽车带来了很多新的视角,也带来了更多的科技属性。在国内,造车新势力和传统车企造的车就有明显的区隔,同样作……
SIM卡以及SD卡合体成为一个芯片也可以?现在已经到了什么都变得紧凑缩小的科技时代,虽然屏幕以及屏占比科技在追求更大更宽,可是很多东西却逐渐在缩小,现在竟然能够连SD卡的位子也省出来,与SIM卡合成一体。IDEM……
华为Mate50华为当前的境况相信大家都清楚,因为多到面制约,华为所有手机均无法使用5G芯片,致使华为在很长一段时间内,都没有发布新机,虽然在多方努力之下,华为P50与华为Nova9均已发布,……
阿里震动,雪梨被封,张大奕还好吗?最近,阿里巴巴做出了一个很大的调整,只是,大部分人没啥感觉。某猫某宝事业部的负责人蒋某,调整到了跨境电商事业部。这给出的信号是,国内零售市场,基本上见顶了,接下来阿里要主攻跨境……
微信收款码将会停用吗?普通百姓生活该怎么办?杞人忧天转账,红包车到山前必有路,船到桥头自然直。这个不用担心。电子收费手段既然已经被普及了,这种手段就不会退回去。微信不能用了,可能会有其他信来代替它,这个……
中国科技创新及中俄科技合作成果展上线部分项目赴俄参展中新社北京12月6日电(记者孙自法)中国科技创新及中俄科技合作成果展线上云展厅6日发布上线,共展出5个领域42个项目,其中12个项目赴俄参加线下展览。中国科技创新及中俄科……
中国工程院院士郭仁忠城市如何数字化?要有好路还要有好车来源:南方日报智慧城市和数字政府要互相支撑。路再好,开拖拉机速度也上不去,反之也一样在2021(第十六届)中国电子政务论坛暨首届数字政府建设峰会上,中国工程院院士、深圳大学智慧……
2000元左右的5G手机和1500的4G手机,该怎么选?分两头说:有钱人只买最贵的,不买最好的。无钱人只买便宜的,买不起最好的。所以,前者无需再论,后者看法有三:1。目前,5G市场还不成熟,基站还不够健全,5G手机还没有大量普……
总想换手机是什么瘾?你好,男生对数码产品的热爱和女生喜欢化妆品和衣服是一样的,笔者认为总想换手机并不是什么瘾,而是一种热爱和喜欢,而且根据数据表明,现在很多人更换手机的周期变短,完完全全用坏一部手……
全球首家直接硅片厂将竣工硅片价格或低于20美分2月27日,硅片制造商1366科技与其战略合作伙伴,韩华QCELLS马来西亚私人有限公司及其与母公司韩华QCELLS韩国公司(统称为韩华QCELLS)正式宣布了他们将突破性的直……
通通下架!支付宝主动做出瘦身,网友现在认错了支付宝作为大家常用的支付工具,内置的应用也是覆盖支付宝用户的衣食住行,可以说通过支付宝就可以满足用户的基本生活需求。随着蚂蚁集团的日益壮大,支付宝功能也变得越来越丰富,几……
高通骁龙895旗舰曝光基于4nm工艺制程近日爆料达人EvanBlass发布推特爆料:SM8450将会是高通下一代旗舰SoC,将继承骁龙X655G基带,并基于4nm工艺制程。CPU采用了基于ARMCortexV9……