热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

公共朋友交换会员功能

有几种写法swap,有些比其他更好。然而,随着时间的推移,人们发现单一的定义效果最好。让我们考虑一下如何考虑编写一个swap函数。

有几种写法swap,有些比其他更好。然而,随着时间的推移,人们发现单一的定义效果最好。让我们考虑一下如何考虑编写一个swap函数。


我们首先看到容器 likestd::vector<>有一个单参数的成员函数swap,例如:

struct vector
{
void swap(vector&) { /* swap members */ }
};

那么,当然,我们班也应该,对吧?嗯,不是真的。标准库有各种不必要的东西,成员swap就是其中之一。为什么?我们继续。


我们应该做的是确定什么是规范的,以及我们的班级 需要 做什么才能使用它。交换的规范方法是 withstd::swap。这就是为什么成员函数没有用的原因:它们不是我们应该交换事物的方式,一般来说,并且与std::swap.

那么,为了std::swap工作,我们应该提供(并且std::vector<>应该提供) 的专业化std::swap,对吗?

namespace std
{
template <> // important! specialization in std is OK, overloading is UB
void swap(myclass&, myclass&)
{
// swap
}
}

好吧,这在这种情况下肯定会起作用,但它有一个明显的问题:函数特化不能是局部的。也就是说,我们不能用这个专门化模板类,只有特定的实例化:

namespace std
{
template
void swap(myclass&, myclass&) // error! no partial specialization
{
// swap
}
}

这种方法在某些时候有效,但并非所有时候都有效。一定会有更好的办法。


有!我们可以使用一个friend函数,并通过ADL找到它:

namespace xyz
{
struct myclass
{
friend void swap(myclass&, myclass&);
};
}

当我们想交换一些东西时,我们关联——然后进行无条件的调用: std::swap

using std::swap; // allow use of std::swap...
swap(x, y); // ...but select overloads, first
// that is, if swap(x, y) finds a better match, via ADL, it
// will use that instead; otherwise it falls back to std::swap

什么是friend函数?这个地区有混乱。

在 C++ 标准化之前,friend函数会做一些称为“朋友名称注入”的事情,其中​​代码的行为
好像函数是在周围的命名空间中编写的一样。例如,这些是等效的预标准:

struct foo
{
friend void bar()
{
// baz
}
};
// turned into, pre-standard:
struct foo
{
friend void bar();
};
void bar()
{
// baz
}

然而,当ADL被发明时,它被删除了。friend然后只能 通过 ADL 找到该函数;如果您希望它是一个自由函数,则需要将其声明为这样(例如,参见
this)。但是看!有问题。

如果你只使用std::swap(x, y),你的重载将 永远不会
被发现,因为你已经明确说过“看看std,别无他处”!这就是为什么有些人建议编写两个函数:一个作为通过ADL找到的函数,另一个用于处理显式std::限定。

但就像我们看到的那样,这不能在所有情况下都有效,我们最终会陷入丑陋的混乱局面。相反,惯用的交换走的是另一条路:不是让类的工作来提供std::swap,而是交换者的工作是确保他们不使用qualifiedswap,就像上面一样。只要人们知道,这往往效果很好。但问题就在这里:需要使用不合格的调用是不直观的!

为了使这更容易,像 Boost 这样的一些库提供了函数boost::swap,它只是对
进行非限定调用swap,并std::swap作为关联的命名空间。这有助于使事情再次简洁,但它仍然是一个无赖。

请注意,C++11 中
的行为没有变化std::swap,我和其他人错误地认为是这种情况。


简而言之:成员函数只是噪音,特化丑陋且不完整,但friend功能完整且有效。而当你交换时,要么使用boost::swap或不合格swap
withstd::swap关联。


‘ 通俗地说,如果在函数调用期间将考虑名称,则将其 关联。 详情请阅读搂3.4.2。在这种情况下,std::swap通常不考虑;但我们可以 关联
它(将其添加到 unqualified 考虑的重载集合中swap),以便找到它。





推荐阅读
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 怀疑是每次都在新建文件,具体代码如下 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • Iamtryingtocreateanarrayofstructinstanceslikethis:我试图创建一个这样的struct实例数组:letinstallers: ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
author-avatar
小乌龟和小土鳖
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有