条款25:考虑写一个不抛出异常的swap函数

条款25: 考虑写出一个不抛异常的swap函数 1、内容引出 swap()属于STL的一部分(算法),而后成为异常安全性编程的脊柱,以及用来处理自我赋值的可能性的一个常见的机制。它是如此的有用,适当的实现就显得十分重要。然而在它的实现的复杂度也比较高。这个条款就在讲swap()函数的实现问题。 2、 widget 和widgetImpl 都是class时,如何写出高效的swap() STL 缺省情况下,由STL提供的swap算法完成,如下: n... 阅读详情

一、全特化与偏特化

特化的意义:对于特定类型如果你有更好的方式实现,就应该由你来实现。
全特化:指定模板的每个数据类型
偏特化:只指定模板中某些数据类型
1、类的全特化和偏特化
#include <iostream>

using namespace std;

template<typename TYPE1, typename TYPE2>
class myClass
{
public:
	myClass(TYPE1 i, TYPE2 j):a(i), b(j){cout<<"这是类模板"<<endl;}
	
private:
	TYPE1 a;
	TYPE2 b;
};

template<>
class myClass<int, char>
{
public:
	myClass(int i, char j):a(i), b(j){cout<<"这是上述类的全特化"<<endl;}
private:
	int a;
	char b;
};

template<typename TYPE2>
class myClass<int, TYPE2>
{
public:
	myClass(int i, TYPE2 j):a(i), b(j){cout<<"这是上述类的偏特化"<<endl;}
private:
	int a;
	TYPE2 b;
};

int main()
{
	myClass<double, float> obj1(1.0,2.0);   //调用类模板 
	myClass<int, char> obj2(1,'c');         //调用全特化 
	myClass<int, double> obj3(1, 2.0);      //调用偏特化 
	return 0;
}

2、函数的全特化
#include <iostream>

using namespace std;

template<typename TYPE1, typename TYPE2>
void myFunction(TYPE1 a, TYPE2 b)
{
	cout<<"这是函数模板"<<endl;
}

template<>
void myFunction<int, char>(int a, char b) 
{
	cout<<"这是上述函数模板的全特化"<<endl;
}

//template<typename TYPE2>
//void myFunction<int, TYPE2>(int a, TYPE2 b)
//{
//	cout<<"这是上述函数模板的偏特化"<<endl; 
//}


int main()
{
	myFunction(1.0, 2.0);  //调用函数模板 
	myFunction(1, 'c');    //调用函数全特化 
	myFunction(1, 1.0);    //调用函数模板 
	return 0;
}

注意:函数不可以偏特化,其功能可以通过函数重载实现。

二、swap函数

1、具体的类情况下如何设计swap函数
#include <iostream>

using namespace std;

class myClassImpl
{
public:
	myClassImpl(int i):val(i){}
	int getVal(){return val;}

private:
	int val;
};

//具体类
class myClass
{
public:
	myClass(int i):p(new myClassImpl(i)){}
	~myClass(){delete p;}
	myClass operator=(const myClass rhs)
	{
		*p = *(rhs.p);
	}
	int getVal()
	{
		return p->getVal();
	}
	void swap(myClass& other)
	{
		using std::swap;
		swap(p, other.p);
	}
	
private:
	myClassImpl* p;
};

//全特化std中的swap函数
namespace std
{
	template<>
	void swap<myClass>(myClass& a, myClass& b)
	{
		a.swap(b);
	} 
} 

int main()
{
	myClass a(1);
	myClass b(2);
	cout << a.getVal() << " " << b.getVal() << endl;
	swap(a,b);
	cout << a.getVal() << " " << b.getVal() << endl;
	return 0;
}

2、模板类的情况下如何设计swap函数
</pre><pre name="code" class="cpp">#include <iostream>

using namespace std;

namespace mySpace
{
	
template<typename TYPE>
class myClassImpl
{
public:
	myClassImpl(TYPE i):val(i){}
	TYPE getVal(){return val;}

private:
	TYPE val;
};

//模板类
template<typename TYPE>
class myClass
{
public:
	myClass(TYPE i):p(new myClassImpl<TYPE>(i)){}
	~myClass(){}
	TYPE operator=(const myClass rhs)
	{
		*p = *(rhs.p);
	}
	TYPE getVal()
	{
		return p->getVal();
	}
	void swap(myClass& other)
	{
		using std::swap;
		swap(p, other.p);
	}
private:
	myClassImpl<TYPE>* p;
};

//函数模板不能偏特化,通过重载swap函数实现 
template<typename TYPE>
void swap(myClass<TYPE>& a, myClass<TYPE>& b) 
{
	a.swap(b);
}
}

int main()
{
	mySpace::myClass<int> a(1);
	mySpace::myClass<int> b(2);
	cout << a.getVal() << " " << b.getVal() << endl;
	mySpace::swap(a,b);
	cout << a.getVal() << " " << b.getVal() << endl;
	return 0;
}

参考: http://blog.youkuaiyun.com/thefutureisour/article/details/7965591



光学相干断层扫描(OCT)在 妇科诊断 中的革命性应用 尽管OCT在妇科的应用提供了许多潜在的优势,但它仍然是一个相对新的技术,并不是所有医疗机构都有能力提供这种类型的成像服务。随着技术的发展和医生对OCT的熟悉程度的提高,预计OCT将在妇科和其他医学领域中扮演越来越重要的角色。早期发现和准确的分类是提高治疗成功率的关键。虽然这是一个相对较新的应用领域,但OCT的非侵入性和高分辨率成像能力可能提供有价值的信息,以提高辅助生殖技术的成功率。:光学相干断层扫描(OCT)在阴道和外阴组织的评估中的应用正在逐渐展开,提供了一种新的方法来诊断和监测各种妇科疾病。 阅读详情

相关推荐

slam_toolbox 简介和使用

专为移动机器人在未知环境中实时构建地图和定位设计。它适用于2D和3D环境,支持多种机器人平台和传感器配置。

weixin_74808846的博客 3307

C++ 不抛出异常的swap()函数的写法

20180314 C++ 不抛出异常的swap()函数的写法swap函数交换两对象的值,缺省情况下,swap动作由标准程序库提供的swap算法完成,其实现为:namespace std{ template&lt;typename T&gt; void swap(T&amp; a,T&amp; b)  {    Ttemp(a);    a= b;    b= temp;  }}只要类型T支持拷贝(...

weixin_39089680的博客 644

OFDM时频脉冲形状与子载波正交性的理解

从多载波调制的角度来理解子载波间正交,首先要明确OFDM默认的脉冲成型是时域矩形窗,时域上每个子载波 ej2πfnte^{j2πf_nt}ej2πfn​t 都被一个矩形窗脉冲gT(t)g_T(t)gT​(t)成型。其次,OFDM子载波间隔 等于 OFDM符号周期的倒数,这是子载波正交的条件。 ​ 根据时频脉冲形状,可以从时域上理解如左图(注意是矩形脉冲 乘 复指数),从频域上理解如右图(sinc脉冲 卷 频点)。 ​

weixin_43803202的博客 2215

《Effective C ++ 》资源管理:条款25--考虑写出一个不抛出异常的swap函数

swap交换函数是常用的函数,在STL中有实现,但是未必高效。本条款讲解的是,怎么写一个兼容STL的、高效的swap函数。

KangRoger的专栏 2662

解密网页视频Blob链接:从防盗链到流媒体分片技术

本文深入解析了网页视频中Blob链接的工作原理,揭示了其作为现代视频防盗链与流媒体分片技术核心的本质。文章详细阐述了Blob对象与Media Source API如何协同工作,将视频数据分片传输,并结合HTML5的video元素实现安全、流畅的播放体验,有效提升了资源保护能力。

c7d8e的博客 317

基于python的奥运会历史数据分析【120年】

数据分析实战案例

xff123456_的博客 3339

Effective C++(一个不抛出异常的swap函数)

author: luixiao1223 title: 一个不抛出异常的swap函数 来看标准STL版本的swap namespace std{ template<typename T> void swap(T& a, T& b) { T temp(a); a = b; b = temp; ...

luixiao1220的博客 259

pe卸载win10更新补丁_禁用Win10系统更新

众所周知,最近WIN10的强制更新导致了很多问题。如:(部分专业软件系统更新后无法使用,硬件中键盘、鼠标、指纹之类的硬件,更新补丁后失灵等问题)。而之前的禁用WindowsUpdate的方法已经失效。下面我们另辟蹊径,利用系统权限的方法使Win10无法更新,达到禁用更新的目的。1.计算机管理-服务中禁用Windows Update服务。2.打开C:\Windows\softwareDistribu...

weixin_39702479的博客 1万+

条款25:考虑写一个不抛出异常的swap函数

考虑如下代码 class WidgetImp1 { //针对Widget数据设计的class,细节不重要 public: //... private: int a, b, c; std::vector<double> v; }; class Widget { public: Widget(const Widet& rhs); Widget& operator=(const Widget& rhs) { //... *pImpl = *(rhs.pI

L_H_L的博客 223

【本地部署实战】LM Studio深度使用指南:从环境搭建到模型调优

LM Studio通过极简的操作流程和强大的生态兼容性,让本地部署大模型成为可能。随着M4芯片的发布和CUDA 12.0的优化,未来本地化AI开发将迎来新的爆发点。建议开发者关注官方Discord社区(https://discord.gg/lmstudio)获取最新模型支持信息。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 8755

IEC61850规约客户端软件开发实战(第六章)

IEC 61850标准中的GOOSE(Generic Object Oriented Substation Event,面向通用对象的变电站事件)功能是变电站自动化系统的核心通信机制,主要用于实现智能电子设备(IED)间高可靠性、低延时的实时信号传输。本章简述其核心功能与技术特点。

半青年的博客 1780

Effective C++——》条款25:考虑写一个不抛出异常的swap函数

我也不知道为什么作者给这个条款起这样的名字,因为这样看上去重点是在“不抛出异常”,但事实上作者只是在全文最后一段说了一下不抛异常的原因,大部分段落是在介绍怎样写一个节省资源的swap函数。 你可以试一下,只要包含了头文件iostream,就可以使用swap函数,比如: 1 #include 2 3 int main() 4 { 5 int a = 3; 6 in

liuxiaomao1988的专栏 568

【常见开源库的二次开发】基于openssl的加密与解密——openssl认识与配置(一)

OpenSSL 是一个开源的软件库,它提供了一系列加密工具和协议,主要用于实现安全通信,如在网络上的数据传输。它支持多种加密算法,包括对称加密、非对称加密、散列函数、伪随机数生成器、数字签名、密钥交换以及证书管理等。

嵌入式技术开发 4162

条款25 考虑写一个不抛出异常的swap

见 effective c++ 的 条款25 (个人知识点总结) 1、当std::swap 对你的类型不高时,提供一个swap成员函数,并确定这个函数不抛出异常 2、如果提供一个member swap, 也请提供一个non-member swap用来调用前者。对于class(而非template),也请特化std::swap. 3、调用swap时应针对std::swap 使用using声明,...

记录一些事情 205

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Effective C++条款25:设计与声明之(考虑写出一个不抛异常的swap函数)

待续

董哥的黑板报 1043

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

[Effective C++]条款25 考虑写出一个不抛异常的swap函数

swap是一个有趣的函数, 原本它只是STL的一部分, 而后成为了异常安全性编程中的脊柱, 有关异常安全性我在条款11中介绍过, 在之后的条款29中也将着重着墨. 由于swap相当有用, 适当的实现非常重要, 好的swap设计可以带来非凡的效率提升, 本条款将着重描写如何写一个合格的swap函数.

tianmu_sama的博客 724

Effective C++ 条款25:考虑写一个不抛异常的 swap 函数

深入理解 C++ swap 函数的设计哲学,掌握自定义 swap 实现异常安全与性能优化的关键技术

凡人叶枫的博客 218

条款25:考虑写出一个不抛出异常的swap函数

swap是个有趣的函数,原本它只是STL的一部分,而后成为异常安全编程的基石,以及用来处理自我赋值可能性的一个常见机制。由于swap功能如此强大,适当的实现很重要。然而在非凡的重要性之外它也带来了非凡的复杂度。所谓swap两对象值,意思是将两对象的值彼此赋予对方。缺省情况下swap动作可由标准程序库提供的swap算法完成。只要类型T支持copying(通过copy构造函数和copy assignment操作符完成),缺省的swap实现代码就会帮你置换类型为T的对象,不需要为此做另外的工作。

依然爱猪的博客 492

Effective C++之条款25:考虑写出一个不抛出异常的swap函数

声明: 文中内容收集整理自《Effective C++(中文版)第三版》,版权归原书所有。 本内容在作者现有能力的基础上有所删减,另加入部分作者自己的理解,有纰漏之处敬请指正。 条款25:考虑写出一个不抛出异常的swap函数 Consider support for a non-throwing swap. swap是个有趣的函数。原本它只是STL的一部分,而后成为异常安全性编程(exce...

HakunaMatata的博客 275

Effective C++ 学习笔记 条款25 考虑写出一个不抛异常的swap函数

因此当你写下一个自定版本的swap,往往提供的不只是高效置换对象值的办法,而且不抛出异常(因为调用的是成员版的swap)。不幸的是有一个理由使你应该为class特化std::swap(很快会描述它),所以如果你想让你的“class专属版”swap在尽可能多的语境下被调用,你需得同时在该class所在命名空间内写一个non-member版本以及一个std::swap特化版本。首先,如果swap的缺省实现码对你的class或class template提供可接受的效率,你不需要额外做任何事。

tus00000的博客 837

考虑写出一个不抛异常的swap函数——条款25

swap是个有趣的函数。原本它只是STL的一部分,而后成为异常安全性编程(exception-safe programing,见条款29)的脊柱,以及用来处理自我赋值可能性(见条款11)的一个常见机制。由于swap如此有用,适当的实现很重要。 所谓swap(置换)两对象值,意思是将两对象的值彼此赋予对方。缺省情况下swap动作可由标准程序库提供的swap算法完成。...

yj_android_develop的博客 329

条款 25 :考虑写出一个不抛出异常的swap函数

条款 25 :考虑写出一个不抛出异常的swap函数 Consider support for a non-throwing swap. 所谓swap(置换)两对象值,意思是将两对象的值彼此赋予对方。标准库缺省swap函数典型实现如下: namespace std{ template<typename T> void swap(T& a,T& b){ T temp(a); a=b; b=temp; } } 在上述代码中只要类型T支持copying,缺省的swa

weixin_45730130的博客 261

Effective C++ 条款 25:考虑写出一个不抛异常的 swap 函数

【代码】Effective C++ 条款 25:考虑写出一个不抛异常的 swap 函数。

weixin_42255569的博客 587

Effective_C++_条款二十五: 考虑写出一个不抛出异常的swap函数

我也不知道为什么作者给这个条款起这样的名字,因为这样看上去重点是在“不抛出异常”,但事实上作者只是在全文最后一段说了一下不抛异常的原因,大部分段落是在介绍怎样写一个节省资源的swap函数。 你可以试一下,只要包含了头文件iostream,就可以使用swap函数,比如: #include <iostream> int main() { int a = 3; int...

Likes的博客 318

条款25:考虑写出一个不抛异常的swap函数

本条款名字虽然在说“不抛异常”,然而内容重点却在正确的设计swap使得更高效、节省资源! 首先,swap标准程序库定义: template<typename T> void swap(T& a, T& b) { T tmp(a); a = b; b = tmp; } 然而,这种复制的成本对于某些class没有必要,我们这里来看...

sgh666666的博客 273

条款25:考虑写出一个不抛出异常的swap函数——136

文章目录pimple手法——136swap特化——138不能偏特化function template——139调用swap可以针对std::swap使用using声明式,然后调用swap不可带任何空间修饰符——140总结——142 缺省情况下swap的实现如下: namespace std{ template<typename T> void swap(T& a...

缇珞的博客 271
上一篇: 红黑树
下一篇: 堆内存和栈内存详解
知行且执行
博客等级 码龄14年 38粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值