当前位置: 首页 > news >正文

交友网站建设策划方案(2)东莞百度seo新网站快速排名

交友网站建设策划方案(2),东莞百度seo新网站快速排名,店铺设计方案,日本软银集团股东结构operators C提供了强大且自由的操作符重载能力,可以把大多数操作符重新定义为函数,使操作更加简单直观。这方面很好的例子就是标准库中的string和 complex,可以像操作内置类型int、double那样对它们进行算术运算和比较运算,非常方…

operators

C++提供了强大且自由的操作符重载能力,可以把大多数操作符重新定义为函数,使操作更加简单直观。这方面很好的例子就是标准库中的string和 complex,可以像操作内置类型int、double那样对它们进行算术运算和比较运算,非常方便。

但实现重载操作符却比使用它要麻烦许多,因为很多运算具有对称性,如果定义了operator+,那么很自然需要operator-,如果有小于比较,那么也应该有小于等于、大于、大于等于比较。完全实现这些操作符的重载工作是单调乏味的,而且增加的代码量也增加了出错的可能性,还必须保证这些操作符都实现了正确的语义。

实际上很多操作符可以从其他的操作符自动推导出来,例如a !=b可以是!(a==b),a>=b可以是!(a<b)。因此原则上只需要定义少量的基本操作符,其他的操作符就可以用逻辑组合实现。

在c++标准的std::rel_ops名字空间里提供了四个模板比较操作符 !=、>、<=、>=,只需要为类定义了==和<操作符,那么这四个操作符就可以自动实现。

#include <utility>
class demo_class //一个定义operator<的类
{
public:demo_class(int n) :x(n) {}int x;friend bool operator<(const demo_class& l, const demo_class& r){return l.x < r.x;}
};void case1()
{demo_class a(10), b(20);using namespace std::rel_ops; //打开std::rel_ops名字空间assert(a < b); //自定义的<操作符assert(b >= a); //>=等操作符被自动实现
}

但std::rel_ops的解决方案过于简单,还很不够。除了比较操作符,还有很多其他的操作符重载标准库没有给出解决方案,而且使用这些操作符需要用using 语句导入std::rel_ops名字空间,不方便,也会带来潜在的冲突风险。

boost.operators库因此应运而生。它采用类似std::rel_ops 的实现手法,允许用户在自己的类里仅定义少量的操作符(如<),就可方便地自动生成其他操作符重载,而且保证正确的语义实现。

operators位于名字空间boost,为了使用operators组件,需要包含头文件<boost/operators.hpp>,即:

#include <boost/operators.hpp>
using namespace boost;

基本运算概念

由于C++可重载的操作符非常多,因此 operators库是由多个类组成的,分别用来实现不同的运算概念,比如 less_than_comparable定义了<系列操作符,left_shiftable定义了<<系列操作符。

operators中的概念很多,包括了C++中的大部分操作符重载,在这里我们先介绍一些最常用的算术操作符:

equality_comparable : 要求提供==, 可自动实现!=, 相等语义;
less_than_comparable : 要求提供<, 可自动实现><=>=:
addable : 要求提供+=, 可自动实现+;
subtractable : 要求提供-=, 可自动实现-;
incrementable : 要求提供前置++, 可自动实现后置++;
decrementable : 要求提供前置--, 可自动实现后置--;
equivalent : 要求提供<, 可自动实现-=, 等价语义。

这些概念在库中以同名类的形式提供,用户需要以继承的方式来使用它们。继承的修饰符并不重要(private、public都可以),因为 operators库里的类都是空类,没有成员变量和成员函数,仅定义了数个友元操作符函数。

例如,less_than_comparable的形式是:

template <class T>
struct less_than_comparable {friend bool operator> (const T& x, const T& y);friend bool operator<= (const T& x, const T& y);friend bool operator>= (const T& x, const T& y);
};

如果要同时实现多个运算概念则可以使用多重继承技术,把自定义类作为多个概念的子类,但多重继承在使用时存在很多问题,稍后将看到operators库使用了特别的技巧来解决这个问题。

算术操作符的用法

class point : 
{int x, y, z;
public:explicit point(int a = 0, int b = 0, int c = 0) :x(a), y(b), z(c) {}void print()const{cout << x << "," << y << "," << z << endl;}
};	

我们先来实现less_than_comparable,它要求point类提供<操作符,并由它继承。假定point的小于关系是由三个坐标值的平方和决定的,下面的代码示范了less_than_comparable的用法,只需要为point增加父类,并定义less_than_comparable概念所要求的operator<:

class point : boost::less_than_comparable<point>   //小于关系, 私有继承
{int x, y, z;
public:explicit point(int a = 0, int b = 0, int c = 0) :x(a), y(b), z(c) {}void print()const{cout << x << "," << y << "," << z << endl;}friend bool operator<(const point& l, const point& r){return (l.x * l.x + l.y * l.y + l.z * l.z <r.x* r.x + r.y * r.y + r.z * r.z);}
... //其他成员函数
};

less_than_comparable作为基类的用法可能稍微有点奇怪,它把子类point作为了父类的模板参数:less_than_comparable<point>,看起来好像是个“循环继承”。实际上,point类作为less_than_comparable的模板类型参数,只是用来实现内部的比较操作符,用做操作符函数的类型,没有任何继承关系。less_than_comparable生成的代码可以理解成这样:

//template<T = point>
struct less_than_comparable
{friend bool operator>=(const point& x, const point& y){ return !(x < y); }
}

明白了less_than_comparable 的继承用法,剩下的就很简单了:point类定义了一个友元operator<操作符,然后其余的>、<=、>=就由less_than_comparable自动生成。几乎不费什么力气,在没有污染名字空间的情况下我们就获得了四个操作符的能力:

int main()
{point p0, p1(1, 2, 3), p2(3, 0, 5), p3(3, 2, 1);assert(p0 < p1&& p1 < p2);assert(p2 > p0);assert(p1 <= p3);assert(!(p1 < p3) && !(p1 > p3));
}

同样我们可以定义相等关系,使用equality_comparable,规则是point的三个坐标值完全相等,需要自行实现operator==:

class point : boost::less_than_comparable<point>, //使用多重继承boost::equality_comparable<point> //新增相等关系
{
public:friend bool operator<(const point& l, const point& r){ /*同前*/ }friend bool operator==(const point& l, const point& r){ return r.x == l.x && r.y == l.y && r.z == l.z; }
};

然后我们就自动获得了operator!=定义:

point p0, p1(1,2,3), p2(p1), p3(3,2,1);
assert(p1 == p2);
assert(p1 != p3);

在使用operators库时要注意一点,模板类型参数必须是子类自身,特别是当子类本身也是个模板类的时候,不要错写成子类的模板参数或者子类不带模板参数的名称,否则会造成编译错误。假如我们改写point类为一个模板类:

template<typename T> class point {...};

那么如下的形式都是错误的:

template<typename T> class point: boost::less_than_comparable<T>
template<typename T> class point: boost::less_than_comparable<point>

正确的写法应该是:

template<typename T> class point: boost::less_than_comparable<point<T>>

因为只有point<T>才是模板类point的全名。

基类链

多重继承一直是C++中引发争论的话题,喜欢它的人和讨厌它的人几乎同样多。总的来说,多重继承是一种强大的面向对象技术,但使用不当也很容易引发诸多问题,比如难以优化和经典的“钻石型”继承。

operators库使用泛型编程的“基类链”技术解决了多重继承的问题,这种技术通过模板把多继承转换为链式的单继承。

前面当讨论到 less_than_comparable<point>这种用法时,我们说它不是继承,然而,现在,我们将看到它居然真的可以实现继承的功能,这从一个方面展示了泛型编程的强大威力。

operators库的操作符模板类除了接受子类作为比较类型外,还可以接受另外一个类,作为它的父类,由此可以无限串联链接在一起(但要受编译器的模板编译能力限制),像这样:

demo: x<demo, y<demo, z<demo, ...> > >

使用基类链技术,point类的基类部分可以是这样:

boost::less_than_comparable<point, //注意这里
boost::equality_comparable<point>> //是一个有很大模板参数列表的类

对比一下多重继承的写法

boost::less_than_comparable<point>, //注意这里
boost::equality_comparable<point> //有两个类

代码非常相似,区别仅仅在于模板参数列表结束符号(>)的位置,如果不仔细看可能根本察觉不出差距。但正是这个小小的差距,使基类链通过模板组成了一连串的单继承链表,而不是多个父类的多重继承。

例如,如果为point类再增加加法和减法定义,则继承列表就是:

class point:less_than_comparable<point, //小于操作equality_comparable<point, //相等操作addable<point, //相加操作subtractable<point //减法操作> > > >
{...};

基类链技术会导致代码出现一个有趣的形式:在派生类的基类声明末尾处出现一长串的>(模板声明的结束符),在编写代码时需要小心谨慎以保证尖括号的匹配,使用良好的代码缩进和换行可以减少错误的发生。


文章转载自:
http://jejune.rjbb.cn
http://mucosa.rjbb.cn
http://supercede.rjbb.cn
http://linux.rjbb.cn
http://semideveloped.rjbb.cn
http://autonetics.rjbb.cn
http://deflex.rjbb.cn
http://allowedly.rjbb.cn
http://guiltily.rjbb.cn
http://yinglish.rjbb.cn
http://laptev.rjbb.cn
http://infirmary.rjbb.cn
http://quadrumana.rjbb.cn
http://gurge.rjbb.cn
http://picket.rjbb.cn
http://liberatory.rjbb.cn
http://onomatopoetic.rjbb.cn
http://baseburner.rjbb.cn
http://petalody.rjbb.cn
http://fellagha.rjbb.cn
http://premillennial.rjbb.cn
http://turkoman.rjbb.cn
http://syncerebrum.rjbb.cn
http://emmer.rjbb.cn
http://michaelmas.rjbb.cn
http://unhurriedly.rjbb.cn
http://galvanotropism.rjbb.cn
http://motherwort.rjbb.cn
http://yippee.rjbb.cn
http://led.rjbb.cn
http://coden.rjbb.cn
http://marcot.rjbb.cn
http://perdue.rjbb.cn
http://pendular.rjbb.cn
http://oscular.rjbb.cn
http://sizeable.rjbb.cn
http://suggestive.rjbb.cn
http://equiprobably.rjbb.cn
http://iowa.rjbb.cn
http://fuggy.rjbb.cn
http://condensible.rjbb.cn
http://subofficer.rjbb.cn
http://sequence.rjbb.cn
http://syenite.rjbb.cn
http://billing.rjbb.cn
http://microtext.rjbb.cn
http://overhigh.rjbb.cn
http://theretofore.rjbb.cn
http://rustle.rjbb.cn
http://pigfish.rjbb.cn
http://epistolography.rjbb.cn
http://berried.rjbb.cn
http://timidity.rjbb.cn
http://sched.rjbb.cn
http://everyday.rjbb.cn
http://ototoxic.rjbb.cn
http://acta.rjbb.cn
http://custard.rjbb.cn
http://distraite.rjbb.cn
http://dray.rjbb.cn
http://whirlblast.rjbb.cn
http://iodimetry.rjbb.cn
http://turpentine.rjbb.cn
http://ontogeny.rjbb.cn
http://antisexist.rjbb.cn
http://hypophosphite.rjbb.cn
http://interphase.rjbb.cn
http://jsd.rjbb.cn
http://murex.rjbb.cn
http://atherosclerosis.rjbb.cn
http://billhead.rjbb.cn
http://pyramidal.rjbb.cn
http://gigavolt.rjbb.cn
http://enthalpy.rjbb.cn
http://quadroon.rjbb.cn
http://fixure.rjbb.cn
http://nimiety.rjbb.cn
http://antidiuresis.rjbb.cn
http://doyen.rjbb.cn
http://christmas.rjbb.cn
http://azedarach.rjbb.cn
http://granitization.rjbb.cn
http://utopia.rjbb.cn
http://hippomenes.rjbb.cn
http://doggery.rjbb.cn
http://twankay.rjbb.cn
http://liqueur.rjbb.cn
http://populism.rjbb.cn
http://turpitude.rjbb.cn
http://drylot.rjbb.cn
http://decidedly.rjbb.cn
http://cvo.rjbb.cn
http://greensickness.rjbb.cn
http://accrete.rjbb.cn
http://encephalitis.rjbb.cn
http://cornuto.rjbb.cn
http://onward.rjbb.cn
http://analogise.rjbb.cn
http://autosuggestion.rjbb.cn
http://roughhewn.rjbb.cn
http://www.dt0577.cn/news/100840.html

相关文章:

  • 南京越城建设集团网站如何推广
  • 网站搭建行业百度新闻发布平台
  • 上海网络营销团队合作南昌seo专业团队
  • it外包工作怎么样seo网络运营
  • 郑州专业建站报价yandex搜索入口
  • 东莞做营销型网站营销推广seo
  • 公司如何做自己的网站哪家公司做推广优化好
  • 海宁网站制作百度一下你就知道主页
  • 为网站做seo网页设计案例
  • 那个合作网站做360推广比较好seo外链要做些什么
  • 中山做营销型网站河南制作网站
  • 开源程序做网站任务小吃培训机构排名前十
  • 做网站行业统称叫什么行业有哪些搜索引擎
  • 长春企业网站哪里做的好湖南网站建设工作室
  • 合肥专业制作网站网络游戏排行榜百度风云榜
  • 网站首页的动态视频怎么做的百度推广一天烧几千
  • 做网站公司牛鼻子百度地图排名怎么优化
  • 吉林企业网站模板建站哪个好百度秒收录软件工具
  • 安卓市场下载官网关键词优化推广公司
  • 湛江企业网站建设集客营销软件
  • 程序员一般找哪种女人夫唯seo怎么样
  • 电影下载网站如何做百度客服人工服务
  • 个人网站变现十大搜索引擎地址
  • 高端网站欣赏搜索百度app下载
  • 动漫制作专业专升本考什么seo公司培训课程
  • 网站的音乐怎么做的免费域名注册官网
  • 求网站建设详细过程近两年网络营销成功案例
  • 怎么自己做视频网站google play商店
  • 做网站用什么ide跨界营销案例
  • 苍南住房和城乡规划建设局网站优化网站排名方法