首页 / 知识
关于C ++:如何重载std :: swap()
2023-04-12 05:47:00

How to overload std::swap()
在排序甚至分配期间,许多标准容器(例如
但是
因此,可以通过使用自定义类型特定的实现重载 重载交换的正确方法是将其写入与交换内容相同的名称空间中,以便可以通过依赖于参数的查找(ADL)找到它。一件特别容易做的事是:
注意Mozza314
这是模拟通用
对我来说,它打印出来:
如果您的编译器打印出不同的内容,则说明它没有正确实现模板的"两阶段查找"。
如果您的编译器符合(符合C ++ 98/03/11中的任何一种),那么它将提供与我所示相同的输出。在这种情况下,确实会发生您担心的事情。将 Dave和我都是委员会成员,已经在该标准的这一领域工作了十年(彼此之间并不总是一致的)。但是,这个问题已经解决了很长时间,我们都同意如何解决。忽视Dave在这方面的专家意见/答案,后果自负。 C ++ 98发布后,此问题暴露出来。从2001年Dave开始,我开始在这一领域工作。这是现代的解决方案:
输出为:
更新资料 观察到:
作品!那么为什么不使用它呢?
考虑您的
现在,它不再起作用。 :-(
因此,您可以将 (按C ++标准)不允许您重载std :: swap,但是特别允许您将自己类型的模板特化添加到std名称空间。例如。
那么在std容器(以及其他任何地方)中的用法将选择您的专业而不是一般的专业。 还要注意,提供交换的基类实现对于您的派生类型还不够好。例如。如果你有
这将适用于基类,但是如果您尝试交换两个派生对象,它将使用std的通用版本,因为模板交换是完全匹配的(并且避免了仅交换派生对象的"基本"部分的问题)。 注意:我已经对此进行了更新,以从我的上一个答案中删除错误的位。天哪! (感谢puetzk和j_random_hacker指出来) 虽然通常不应该在std ::名称空间中添加内容是正确的,但明确允许为用户定义类型添加模板特化。没有重载功能。这是一个微妙的区别:-)
std :: swap的特殊化如下所示:
没有template <>位,它将是一个未定义的重载,而不是允许的特殊化。 @Wilka的更改默认名称空间的建议方法可能与用户代码一起使用(由于Koenig查找更倾向于使用无名称空间的版本),但这并不能保证,实际上也不是必须的(STL实现应使用完整的名称)。合格的std :: swap)。 在comp.lang.c ++。moded上有一个主题很长的讨论主题。不过,大多数内容都与部分专业化有关(目前尚无好方法)。 |
最新内容
相关内容
python怎么对字典排序
python怎么对字典排序,培训,情况,字典,括号,结果,形式,列表,函数,也就是说,细节,python对字典的排序:创建一个字典dict1={a:2,b:3,c:8,d:4}1、pythonsort()怎么排序
pythonsort()怎么排序,数据,培训,方法,参数,元素,类型,结果,下面,数组,字典,python中的sort()函数只能应用在列表list上,而sorted可以对所有可python函数重载吗
python函数重载吗,培训,函数,目的,例子,下面,以上,类型,结果,更多,内容,python中是不支持函数重载的,但在python3中提供了这么一个装饰器functpython类重载
python类重载,情况,培训,统一,代码,设计,名字,数据,参数,函数,类型,python重载(overloadingmethod)重载是让类以统一的方式处理不同类型数据python如何实现对Python中列表的排
python如何实现对Python中列表的排序?,培训,工作,实例,方法,关键字,对象,函数,以上,列表,表达式,对List进行排序,Python提供了两个方法方法1.python输入三个数字从小到大排序
python输入三个数字从小到大排序,数字,培训,整数,从小到大,错误,继续,方法,提示,用户,函数,python输入三个数字从小到大排序1、说明使用list.python归并排序的基本思路
python归并排序的基本思路,培训,数组,基本思路,两个,分解,表示,列表,指针,归纳,序列,python归并排序的基本思路基本思路归纳排序是采用分治法python归并排序和快速排序比较
python归并排序和快速排序比较,数据,预期,时间,位置,培训,序列,复杂度,算法,分界,空间,python归并排序和快速排序比较1、在预期情况下的快速python快速排序的运作过程
python快速排序的运作过程,位置,培训,底部,基准,数列,元素,分区,数组,过程,基准点,python快速排序的运作过程运作过程1、从数列中挑出一个元python列表排序的两种方式
python列表排序的两种方式,培训,列表,方式,函数,顺序,参数,排列,元素,以上,方法,python列表排序的两种方式1、使用sort()永久排序列表。用sor关于泛型:在C#中对IList进行排序
关于泛型:在C#中对IList进行排序,关于泛型:在C#中对IList进行排序,发现,服务,排序,接口,Sorting an IList in C#
所以我今天遇到了一个有关于C#:排序组合集合
关于C#:排序组合集合,关于C#:排序组合集合,视图,筛选,排序,对象,Sorting a composite collection因此WPF不支持CompositeCollections视