哪些标准 C++ 类不能在 C++ 中重新实现?

2024-02-08

我正在查看 C++0x 的计划并发现std::initializer_list用于在用户类中实现初始值设定项列表。此类无法在 C++ 中实现 不使用自身,或者使用一些“编译器魔法”。如果可以的话,就不需要它了,因为无论您使用什么技术来实现initializer_list可用于在您自己的类中实现初始值设定项列表。

还有哪些类需要某种形式的“编译器魔法”才能工作?标准库中有哪些类无法由第三方库实现?

编辑:也许我应该说实例化而不是实现。更重要的是,此类与语言功能直接相关(如果没有initializer_list).

与 C# 的比较可能会澄清我的疑问:IEnumerable 和 IDisposable 实际上是硬编码到语言功能中的。我一直认为 C++ 没有这个问题,因为 Stroustrup 试图让所有东西都可以在库中实现。那么,是否还有其他类/类型与语言特性有着千丝万缕的联系。


std::type_info是一个简单的类,尽管填充它需要typeinfo:编译器构造。

同样,异常是普通对象,但抛出异常需要编译器魔法(异常在哪里分配?)。

对我来说,问题是“我们能有多接近std::initializer_list没有编译器魔法吗?”

看着维基百科 http://en.wikipedia.org/wiki/C%2B%2B0x#Initializer_lists, std::initializer_list<typename T>可以通过看起来很像数组文字的东西来初始化。让我们尝试给予我们的std::initializer_list<typename T>一个采用数组的转换构造函数(即采用单个参数的构造函数T[]):

namespace std {
     template<typename T> class initializer_list {
         T internal_array[];
         public:
         initializer_list(T other_array[]) : internal_array(other_array) { };

         // ... other methods needed to actually access internal_array
     }
}

同样,一个类使用std::initializer_list通过声明一个接受单个构造函数来实现这一点std::initializer_list参数——又名转换构造函数:

struct my_class {
    ...
    my_class(std::initializer_list<int>) ...
}

所以这一行:

 my_class m = {1, 2, 3};

使编译器思考:“我需要调用构造函数my_class; my_class有一个构造函数,它需要一个std::initializer_list<int>;我有一个int[]文字;我可以转换一个int[] to a std::initializer_list<int>;我可以将其传递给my_class构造函数”(在告诉我 C++ 不允许链接两个隐式用户定义转换之前,请阅读答案的末尾).

那么这有多接近呢?首先,我缺少初始化列表的一些功能/限制。我不强制执行的一件事是初始化列表只能用数组文字构造,而我的initializer_list也将接受一个已经创建的数组:

int arry[] = {1, 2, 3};
my_class = arry;

此外,我没有费心去搞乱右值引用。

最后,如果编译器隐式地将两个用户定义的转换链接在一起,则此类只能按照新标准规定的方式工作。这在正常情况下是被明确禁止的,因此该示例仍然需要编译器魔法。但我认为(1)类本身是一个普通类,并且(2)所涉及的魔力(强制执行“数组文字”初始化语法并允许两个用户定义的转换隐式链接)比看起来要少乍一看。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

哪些标准 C++ 类不能在 C++ 中重新实现? 的相关文章

  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co

随机推荐

  • 从 sql 文件恢复单个表转储

    我有 sql 文件的完整转储 例如dump full sql尺寸的1 3GB 它有一些像这样的表 dancing core spice dancing sea beast forde clear one forde super now 现在
  • 枚举mysql查询中使用的表?

    有没有办法枚举mysql查询中使用的表 可以说我有疑问 SELECT FROM db people people facts pf INNER JOIN db system connections sm ON sm source id pf
  • 如何查看 Chrome 扩展程序的总安装数?

    我正在通过 Chrome 网上商店分发 Chrome 扩展程序 但我无法找到网上商店告诉我我的扩展程序有多少 总安装量 的地方 我想知道自从我第一次上传扩展程序以来总共有多少人安装了它 在谷歌上进行一些快速搜索 在谷歌帮助部分中找到了以下文
  • Mac OS 和 FreeBSD 之间 kqueue 处理 fifo 的差异?

    我正在开发一个应用程序 该应用程序使用 fifos 进行 IPC 并使用事件通知 API 例如 epoll 或 kqueue 来监视 fifos 以获取要读取的数据 应用程序期望 如果 fifo 的写入器终止 则读取器将通过事件通知 API
  • xcopy 包含文件夹

    这应该是一个简单的问题 但我一直找不到答案 我想将文件夹 不仅仅是内容 复制到桌面 我尝试过的所有内容都只包含该文件夹的内容 我已经尝试了下面的内容 但内容仍然只是复制 xcopy C Users user Folder C Users u
  • Sencha Touch - 需要嵌套列表示例

    我需要一个简单的嵌套列表视图示例 类似这样的事情 source roosteronacid com http www roosteronacid com mockup png 当您单击某个项目时 您将过渡 滑动 到包含另一个列表的下一个视图
  • 在 Eclipse“作为小程序运行”中也更改我的小程序的大小

    我目前正在做我的第一个小程序 在测试结果时 我希望能够在预览窗口中的 eclipse 中运行它 而不是总是将小程序部署到 jar 中并在浏览器中打开页面 浏览器缓存杀了我 我总是需要重新启动浏览器 不管怎样 当我尝试使用 运行方式 gt J
  • 为什么不能推断这些泛型类型?

    我有以下代码 public static class CardView public static object Column
  • 如何在 Matplotlib 中为文本添加动画?

    我正在尝试为 Matplotlib 图中的文本框设置动画 但似乎无法使其工作 有谁知道如何正确执行此操作 下面是一个例子 from matplotlib import animation import matplotlib pyplot a
  • 从网络摄像头录制视频流并将 blob 上传到服务器

    所以我有一个网站可以记录来自用户网络摄像头的视频流并将其转换为 blob 使用getUserMedia 我现在想将此 blob 发送到服务器 以便可以保存和处理视频 我在通过 ajax 发送 blob 文件时遇到问题 我尝试过使用 form
  • 如何使用 AJAX 更新选择菜单而不使用表单内的

    我正在使用 ajax 调用来更新选择菜单 ajax 调用通过从不同的 php 文件运行来将列表放入我的选择菜单中 这是 JS 插入片段 if req status 200 document getElementById countydiv
  • Pyplot:共享轴并且子图之间没有空间

    这与 或者更确切地说是后续 有关matplotlib 中共享轴方形子图的新 pythonic 风格 https stackoverflow com questions 13629994 new pythonic style for shar
  • 如何对使用层方法的 lambda 逻辑进行单元测试?

    您好 我有 AWS Lambda 我想为其添加一个层 我希望能够只测试 lambda 的单个方法 然而 其中许多都使用层逻辑 因此在我看来这并不容易 做到这一点的最佳方法是什么 一种方法是封装层 主机位于某处并将其用作依赖项 既然如此 为什
  • Delphi XE - TRibbon 操作始终将焦点发送到 MainForm

    当我将 TRibbon 控件放置在不是应用程序 MainForm 的窗体上时 TRibbon 的操作 即剪切 粘贴 将始终在执行操作后将焦点返回到 MainForm 即使保存 TRibbon 的 TForm 不是 MainForm 的子级
  • “less”命令显示输出所花费的时间

    我有一个可以产生大量输出的脚本 脚本在该点暂停几秒钟T 现在我正在使用less命令来分析脚本的输出 所以我执行 script less 我让它运行足够的时间 以便脚本完成执行 现在 我按 Pg Down 键查看 less 命令的输出 令人惊
  • 使用 pythonpyral 将标签添加到 Rally 缺陷

    我正在尝试使用pyral python 包创建Rally 缺陷 需要添加标签 TestTag2 有没有办法在创建缺陷时添加标签 我正在尝试在创建缺陷后添加标签 但出现以下错误 info Workspace workspace 123 Pro
  • 如何在 ASP.NET Core 中获取 HttpContext.Current.Session?

    我需要将 MVC 项目迁移到 net Core 我知道它已从 ASP net Core 中删除了 System Web 我需要转换 HttpContext Current Session 名称 在 ASP NET Core 中为 Null
  • 访问 Firefox 中的文件下载对话框

    是否有任何类型的 API 可以让我在 Firefox 中操作文件下载对话框 我想访问用户执行某些操作时出现的内容 而不是自己启动的内容 我想做的是从 Selenium 访问这个对话框 我也不确定 Selenium 特权模式 是否足以访问 c
  • MSB3411 无法加载 Visual C++ 组件

    我有 MS Visual Studio 2012 Ultimate 操作系统是 Windows 7 并且安装了 nodeJs 我想使用 npm 安装 socket io 但出现以下错误 C Users NEW gt npm install
  • 哪些标准 C++ 类不能在 C++ 中重新实现?

    我正在查看 C 0x 的计划并发现std initializer list用于在用户类中实现初始值设定项列表 此类无法在 C 中实现 不使用自身 或者使用一些 编译器魔法 如果可以的话 就不需要它了 因为无论您使用什么技术来实现initia