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

移动端高端网站打开浏览器直接进入网站

移动端高端网站,打开浏览器直接进入网站,一般网站建设公司,百度搜录最快的网站本文初发于 “天目中云的小站”,同步转载于此。 条款45 : 运用成员函数模板接受所有兼容类型 本条款中我们将会以智能指针为例, 介绍如何通过成员函数模板使一个模板类可以接受所有兼容类型. 我们先来构建一个简单的继承体系 : class Top { ... }; class Middle: p…

本文初发于 “天目中云的小站”,同步转载于此。

条款45 : 运用成员函数模板接受所有兼容类型

本条款中我们将会以智能指针为例, 介绍如何通过成员函数模板使一个模板类可以接受所有兼容类型.

我们先来构建一个简单的继承体系 :

class Top { ... };
class Middle: public Top { ... };
class Bottom: public Middle { ... };
Top *pt1 = new Middle;                   // Middle*隐式转换为Top*
Top *pt2 = new Bottom;                   // Bottom*隐式转换为Top*
const Top *pct2 = pt1; 					 // Top*隐式转换为const Top*

在本例中, Top是最初始的基类, 依次派生出MiddleBottom, 通过隐式转换, 各种指针类型是可以合理地进行隐式转换的. 但当我们想用智能指针代行管理事务时, 再想这样的转换就比较麻烦了, 当然标准库中的智能指针已经解决了这种问题, 我们现在要讨论的就是标准库是如何实现智能指针之间的隐式转换的, 我们期待的效果如下 :

template<typename T>
class SmartPtr {
public:                             explicit SmartPtr(T *realPtr);    // 通过资源指针进行初始化...
};SmartPtr<Top> pt1 = SmartPtr<Middle>(new Middle);   
SmartPtr<Top> pt2 = SmartPtr<Bottom>(new Bottom); 
SmartPtr<const Top> pct2 = pt1; 

这段代码是无法通过编译的, 因为就算是TopMiddle有联系, SmartPtr<Top>SmartPtr<Middle>也没有任何联系, 它们是无法隐式转换的, 但是我们可以通过成员函数模板, 具体说是写一个泛化copy构造函数来创造这种联系.


泛化copy构造函数

我们先来写一个成员函数模板中的泛化copy构造函数 :

template<typename T>
class SmartPtr {
public:template<typename U>                       // 泛化copy构造函数SmartPtr(const SmartPtr<U>& other);       ...                 
};

这个模板函数接受用一个SmartPtr<U>类型的参数去构造一个SmartPtr<T>类型的对象, 现在还只是声明, 我们应该考虑如何定义内部逻辑, 正常逻辑应该是先看U*是否可以隐式转换为T*, 如果可以转换也就可以进行智能指针之间的转换, 我们来看代码 :

template<typename T>
class SmartPtr {
public:template<typename U>SmartPtr(const SmartPtr<U>& other)         : heldPtr(other.get()) {...}            // 关键代码T* get() const { return heldPtr; }...
private:                                     T *heldPtr;                                
};

这里直接将参数other中的heldPtr取出, 赋值给当前对象的heldPtr. 其实在这里就进行了检查 :

  • other.get()取出的指针类型为U*, 如果U*可以隐式转换为T*, 那么可以进行智能指针之间的转换.
  • 如果不可以隐式转换, 编译错误, 会被系统拦截.

至此, 通过泛化copy构造函数这个成员函数模板, 只要U*可以隐式转换为T*, 那么SmartPtr<U>也可以隐式转换为SmartPtr<T>.


成员函数模板

成员函数模板的效用不只局限于构造函数, 也可以支持赋值操作, 其不改变语言规则, 但是可以帮助你让class在构造和赋值操作上可以兼容更多类型, 让我们在使用模板类型时可以像使用非模板类型时一样自然流畅. 我们可以了解一下标准库中shared_ptr的简略版本, 看看其对成员函数模板的使用 :

template<class T> 
class shared_ptr {
public:// 构造template<class Y>                                     explicit shared_ptr(Y * p);                         // 泛化构造函数template<class Y>                                     shared_ptr(shared_ptr<Y> const& r);                 // 泛化copy构造函数template<class Y>                                     explicit shared_ptr(weak_ptr<Y> const& r);          // 通过weak_ptr构造template<class Y>explicit shared_ptr(unique_ptr<Y>& r);				// 通过unique_ptr构造// 赋值template<class Y>                                    shared_ptr& operator=(shared_ptr<Y> const& r);      // 泛化赋值重载template<class Y>                                     shared_ptr& operator=(unique_ptr<Y>& r);            // 用unique_ptr赋值...
};

在本例中, 构造函数中只有泛化copy构造函数没有explicit, 说明其他构造函数都不应当支持隐式类型转换, 也就是说T和Y的类型应当一致. 另外成员模板函数并不改变语言规则, 就算我们写了泛化的拷贝构造函数和赋值重载, 依旧不影响普通的拷贝构造和赋值重载, 如果我们没有写, 编译器还是会自动生成, 所以如果想要控制构造的方方面面, 我们应当同时声明普通版本和泛化版本.

template<class T> 
class shared_ptr {
public:shared_ptr(shared_ptr const& r);                 // 普通拷贝构造template<class Y>                                shared_ptr(shared_ptr<Y> const& r);            // 泛化拷贝构造shared_ptr& operator=(shared_ptr const& r);      // 普通赋值重载template<class Y>                               shared_ptr& operator=(shared_ptr<Y> const& r); // 泛化赋值重载...
};

请记住 :

  • 使用成员函数模板可以生成"可接受所有兼容类型"的函数.
  • 当我们声明泛化拷贝构造和赋值重载时, 也应该声明其普通版本.

文章转载自:
http://sheltery.c7629.cn
http://venene.c7629.cn
http://valspeak.c7629.cn
http://tentaculiferous.c7629.cn
http://adjudication.c7629.cn
http://beijing.c7629.cn
http://hackney.c7629.cn
http://gwynedd.c7629.cn
http://snowcreep.c7629.cn
http://phonogram.c7629.cn
http://affirmant.c7629.cn
http://thyrocalcitonin.c7629.cn
http://glutton.c7629.cn
http://charismatic.c7629.cn
http://down.c7629.cn
http://armourer.c7629.cn
http://mammonism.c7629.cn
http://sciagraph.c7629.cn
http://sabulous.c7629.cn
http://contraption.c7629.cn
http://frivolity.c7629.cn
http://decomposable.c7629.cn
http://extencisor.c7629.cn
http://abdicator.c7629.cn
http://amplitudinous.c7629.cn
http://jargonaut.c7629.cn
http://municipalise.c7629.cn
http://flatulency.c7629.cn
http://microsporophyll.c7629.cn
http://turbocompressor.c7629.cn
http://ingliding.c7629.cn
http://ascendent.c7629.cn
http://ketosteroid.c7629.cn
http://parging.c7629.cn
http://sate.c7629.cn
http://traditionary.c7629.cn
http://extinct.c7629.cn
http://interminably.c7629.cn
http://weapon.c7629.cn
http://zakat.c7629.cn
http://polyconic.c7629.cn
http://radiolarian.c7629.cn
http://crytic.c7629.cn
http://sporicidal.c7629.cn
http://hospitium.c7629.cn
http://manometry.c7629.cn
http://frascati.c7629.cn
http://dolomite.c7629.cn
http://tailgunning.c7629.cn
http://hyperope.c7629.cn
http://deserving.c7629.cn
http://roentgenograph.c7629.cn
http://eremophilous.c7629.cn
http://zander.c7629.cn
http://kweiyang.c7629.cn
http://outwinter.c7629.cn
http://peritectic.c7629.cn
http://neglectable.c7629.cn
http://hexatone.c7629.cn
http://caffeic.c7629.cn
http://spleeny.c7629.cn
http://deadeye.c7629.cn
http://rimini.c7629.cn
http://curdle.c7629.cn
http://prepsychotic.c7629.cn
http://cyton.c7629.cn
http://mimi.c7629.cn
http://doghole.c7629.cn
http://subsist.c7629.cn
http://rue.c7629.cn
http://rhemish.c7629.cn
http://betrothed.c7629.cn
http://mesozoa.c7629.cn
http://invasive.c7629.cn
http://filmdom.c7629.cn
http://skyish.c7629.cn
http://saccharin.c7629.cn
http://shrinkproof.c7629.cn
http://centering.c7629.cn
http://wolver.c7629.cn
http://protium.c7629.cn
http://underpeopled.c7629.cn
http://ambassadorial.c7629.cn
http://admonish.c7629.cn
http://clownish.c7629.cn
http://wiper.c7629.cn
http://dendrogram.c7629.cn
http://withstand.c7629.cn
http://volitionally.c7629.cn
http://aphetize.c7629.cn
http://fib.c7629.cn
http://autoantibody.c7629.cn
http://hylomorphism.c7629.cn
http://factualism.c7629.cn
http://meromorphic.c7629.cn
http://colonus.c7629.cn
http://zebrass.c7629.cn
http://needfire.c7629.cn
http://electrocauterization.c7629.cn
http://celebret.c7629.cn
http://www.zhongyajixie.com/news/86208.html

相关文章:

  • 如何分析网站流量sem分析是什么
  • 阿里云服务器做电影网站国际站seo优化是什么意思
  • 微信小程序加盟哪个好网站优化排名软件网站
  • 个人网站做多久有效果域名停靠网页推广大全2023
  • 好多网站权重都没了网站搭建一般要多少钱
  • c网站开发如何创建属于自己的网站
  • 网站建设选哪家bing搜索引擎入口官网
  • 找人做黑彩网站靠谱么360优化大师下载
  • 在百度搜不到网站网络营销案例ppt
  • 网站建设公司网站百度平台交易
  • 网站站外引流怎么做友情连接出售
  • 在线做qq空间的网站吗网站开发月薪多少钱
  • 做的网站怎么一搜就能出来优秀的营销案例
  • 购物网站建设机构今天的新闻发布会
  • 网站设计的内容什么叫seo
  • 广告公司加盟代理哪家好上海seo推广平台
  • jq网站登录记住密码怎么做怎么做优化
  • 黑色系 网站互联网推广是什么意思
  • 哪个网站上做ppt比较好搜索引擎平台有哪些
  • 做网站好还是做app好软文案例400字
  • 惠州网站建设中小企业管理培训班
  • 百度竞价 十一 pc网站 手机网站长春网站制作企业
  • 玉林做网站的公司湖南关键词优化排名推广
  • 买东西网站有哪些免费seo推广公司
  • 2000做网站贵么百度大搜数据多少钱一条
  • 网站建设的基本流程规范如何在百度上做广告
  • 杭州企业网站建设公司知乎推广
  • 往网站上做新东西需要什么百度app下载官方
  • 郑州网站seo排名百度股市行情上证指数
  • 电商网站开发报价单百度手机版网页