这是对盖伊·戴维森(Guy Davidson)的文章“不包括电池:C ++标准库中应包含的内容”的答复。 ”。

在过去的几年中,一直在推动将图形库包含在C ++标准中。 这有点像开罗。 或SDL。 当前形式的提案在这里 。

在目前的状态下,图书馆提案可以在预先分配的表面上绘制一些形状,对图像有一定的支持,并且有一些课程项目可以添加文本,也许可以以鼠标/键盘处理的形式进行输入。

图书馆的主要目标似乎是教学。 提出的论点是,对于孩子来说,在屏幕上闪闪发光的小精灵很酷很酷。 当然,已经存在执行此操作的库,还有更多,但是您会看到,C ++没有像样的,惯用的软件包管理器,因此,当然,一些著名的委员会成员得出的结论是,C ++标准应该提供2D图形库。的盒子。

我确实认为这是一条不应走的路,这样做最多是在浪费时间。 让我来告诉你为什么。

但是,首先,需要进行一些澄清。

盖伊·戴维森(Guy Davidson)和其他人为此付出了大量的工作,时间和精力。 推动该提案通过标准化的人们比我以前的专家要多得多。

我没有为C ++做任何贡献,所以接下来的事情只是一个人的意见。

我还想明确指出,我对该图书馆没有负面意见。 我的问题是,此时需要包含2D绘画库,即C ++标准中的任何绘画库。

希望我不会被误解!

无论如何,让我们开始吧。

C ++标准库不是库。

C ++标准的确切含义是:规范明确的文档,以最详细,明确的方式描述C ++的含义以及其工作方式。 目标是任何人都可以通过实现该规范来自己实现C ++编译器。 但是,恰恰是该规范不够具体,或者实施得不太正确,或者执行得很周到,因此各种C ++编译器最终在行为上各不相同。 有时根本无法实施,因为执行实施的人员和执行规范的人员忘记了彼此交谈。

现在,该规范的很大一部分描述了标准模板库,这是每个符合要求的编译器附带的库。

该规范至少存在5种实现,由许多实体维护。 有些是开源的,有些则不是。 它们每个都在选定的平台和系统子集中工作。 即使它们位于任何C ++程序的最底层,也像其他任何库一样,也容易出现错误。

在这种情况下,C ++标准库中应该包含或不应该包含什么是一个非常重要的问题。 与编译器捆绑在一起的标准配件是什么? 大多数人需要什么才能使C ++高效?

盖伊的文章描述了一个人可以拥有的职位。 也许我们什么都不需要? 也许我们需要一些词汇类型? 也许是容器? 也许不会 ? 我们需要文件系统支持吗? 插座? json吗? XML? rpg制作工具? sql? HTML? javascript vm吗? 2D图形? 3D图形? 肥皂 ? IPC? 窗口化? 应该定义pi吗? 那websockets呢? FTP? ssh? VR? AR? 加密货币? ssl? 我们需要ssl但不需要其他加密货币吗? 深度学习? 声音? 3D音效? 视频解码? gif?

显然,我们需要画一条线。

某个地方?

在哪

让我们看看.Net。 或Java。 提到STL时,通常会比较C ++和Java。 Java很酷,对吧? 它基本上具有套接字,HTTP和加密以及所有内容。

但是Java主要由单个实体维护。 因此,Oracle的某个人决定Java应该具有套接字并实现了套接字,内部进行了审查,现在Java具有套接字了。 有时,Google希望使用相同的API进行套接字,然后在他们说“提前”之前,被要求赔偿90亿美元。

同时,C ++规范经历了漫长而痛苦的过程,直到获得投票,并且在每个功能,每种方法上都获得了多数共识。 应该把它叫做data吗? get ? “在彭博社,我们有使用200万行代码库data经验”,彭博社的工作人员会说。 “我们注意到在EBCDIC键盘上使用类型get更快。” Will反对IBM的家伙。 “而且我们有300万行代码库”。

我对哪种模式最好没有意见。 仁慈专政显然只有在独裁者是仁慈的情况下才有效。

但是,我将论证民主不适合建立一个好的图形库。

委员会资源有限。

即使睡眠不足剥夺了提案的作者的汗水,大部分工作和投票还是在为期一周的季度会议中进行,人们在会议中讨论越来越多的提案。 随着委员会学会提高透明度,更多的人做出了贡献,从而为参加会议的人带来了更多的工作。 这项工作几乎没有钱。 充其量,您可以希望有人向您支付前往会议举行地点的佛罗里达海滩,瑞士绿色山丘或夏威夷游泳池的机票。 据报道,您将永远不会看到海滩,山丘或泳池。

而且由于资源有限且时间有限,因此需要对提案进行排序,确定优先顺序甚至丢弃。 ISO C ++指南试图描述应该如何进行排序和优先级排序。

于是问题就变成了:委员会是否可以抽出时间在2D图形库上工作,这是优先事项吗?

该提案以当前形式(仅限于绘图形状)大约150页长。 这是为下次会议提交的最大建议之一。

它只会变得更大。 “小型而简单的图形库”的复杂性永无止境。 在该提案上的每一分钱都不会花在其他工作上。 当然,人们会讨论他们感兴趣的提案,并且讨论会并行进行。 仍然。 在这些会议中,每20万名c ++开发人员中可能只有一个人。

让我们画一个三角形

2D图形与标准化流程所擅长的完全相反。 标准化与形式主义有关,因此它最适合描述形式事物,数学和算法。 现实变得越混乱,将其写在纸上越难描述,并且几十年来该纸一直是真相的来源。

首先要玩漂亮的像素游戏是要获得“表面”。 绘制像素的画布。

因此,希望您有一个surface类,您可以为其指定尺寸,并为您提供一个可以在其上绘画的画布。

可是等等。 在大多数桌面系统上,如果需要表面,则需要将其放在窗口中。 Windows通常具有标题,因此图形API应该可以处理它,对吗?

您可能还希望窗口具有图标。 图标是大多数系统上的文件,其格式特定于系统。 但是有时候它不是路径,而是对应于路径的名称。

在某些桌面操作系统上执行程序期间,窗口的大小可能会更改。

有时,可以将窗口移至具有其他分辨率的另一个屏幕。 还有这种奇怪的新屏幕,其中虚拟像素大于真实像素吗? 除非您要渲染图像或其他东西,否则您应该确保使用了所有酥脆小像素的全部功能,因为客户因吹嘘其屏幕的酥脆度而支付了溢价。

那边的那个女人很嫉妒,所以她买了一个电视,每像素40位。 你真的看不出有什么区别,但是你要告诉她她浪费了5000美元吗?

然后,口袋里有一个屏幕,它的各个方向都旋转着,现在表面变得不规则了。 但是它没有窗口,所以没有标题或图标。

现在是几奌 ? 哦,这太小了……但是最好去看一本书WTF ELECTRONIC INK,您应该尽可能少刷新,而且只有黑色?

世界疯了吧? 让我们坚持使用Linux,对吧? 因此,在Linux上,有一个叫做X11的东西,您需要向它发送一个表面…哦,抱歉,在撰写本文时,X11已经过时了,现在您应该使用Wayland…除非您有帧缓冲区? 可以使用opengl进行加速。 或嵌入式opengl。 完全不同的东西。 但实际上,Vulkan的速度比这两件事都要快。 哦,在这个系统上,我们希望您自己绘制窗口,关于CSD与SSD的战争已经进行了多年,而且您不能袖手旁观。

如果您使用的是CSD,请确保我可以正确拖动窗户,并且设置了粘性角,以便窗户可以很好地对齐。 确保处理它们。 正确地。 当您拖动窗口时,窗口应该有点透明,您知道窗口合成对吗?

好的,您开始告诉自己,也许绘图很复杂。 让实现者的编译器作者和库供应商应对所有这些废话。 因此,您提供了一个可在任何地方使用的API,因此它绝对不会处理任何事情,也就是说,它无法在任何地方使用。

现在,编译器作者有点生气。 他们一生中想要的就是编写编译器,并且在那里,他们试图了解GDI的工作原理。 另外,Microsoft可能对提供绘图框架并不真正感兴趣,他们希望用户使用基于XML的WinRT工具。 同时,GCC伙计们仍在尝试让std::thread在Windows上工作。

lang人得到的错误报告是“不起作用”。 人们期望STL 在任何地方都能完美,一致地工作

没问题。 我们将使图形库成为可选的。 因此,现在标准库中有一些不是标准的。 如果以及何时实施它们,它们在每个平台上的表现都不尽相同。 因此,现在使用标准工具编写的代码不可移植。 因此,我们需要在存储库中拥有STL的副本以及混乱的构建脚本。 回到原点。

也许我们在某个地方搞砸了? 让我们看一下互联网上存在的内容。 人们肯定有显示器,所以一定会为他们编写库,对吧?

事实证明,Qt非常受欢迎。 但是,它比显示三角形要多得多。 它于1995年发布。它具有字符串,线程和大量的东西。 人们真的没有提出更好的建议吗?

wxWidgets甚至更老。 它也具有字符串和线程以及许多与图形库无关的东西。 GTK是完全一样的东西。

但是C ++目标与SDL之类的东西更加一致。 1995年发布,带有线程,字符串和奇怪的东西。 Allegro,1990年发行。相同的东西

您会看其他语言。 当然,Rust社区有一个很棒的绘画框架,对吗? 还是围棋人? 原来,他们围绕Qt或SDL或类似东西编写包装器,就像他们认为从头开始就很复杂。

因此20年后,您设法在所有平台上绘制一个三角形。 对于所有的一些定义。

这是相当大的成就,因此您想与世界分享您的快乐。 人们主要使用语言进行交流[需要引用],所以您将在屏幕上显示一些单词,从三角形变成那个单词有多难?

无效draw_text(std :: point2d,std :: string);

您了解到有一个名为“ Unicode”的标准,它描述了世界各地人们使用的所有字母。 这么多字母。 Unicode标准的大小大约是您5年以来一直在研究的提案的10倍。 幸运的是,大多数编程语言都支持至少部分Unicode。 除了C ++。 好吧,现在让我们将其放在一边。

因此,文本是使用字体呈现的。 字体通常安装在系统上。 有一个叫做字体数据库的东西,它告诉字体是什么。 除非系统没有字体数据库。 或没有字体。 还是没有系统。 人们还喜欢使用自己的字体。

字体是一种文件,其格式为标准格式。 大约有5种竞争标准。

字体文件可以包含字形表,PNG,SVG,在虚拟机中执行的脚本,以及所有这些的组合。 有些字体带有颜色,但并非所有人都喜欢颜色。 您的孩子喜欢颜色。 他们给你寄了一封信。 您将添加对猫的支持,对吗?

您将了解有关亚像素渲染的信息。 您因侵犯专利权而被判入狱几个月。 您认为可以利用这段时间来学习百科全书中的连字。 您开始后悔成为一名开发人员,而将新职业视为修道士。

字体渲染涉及很多数学运算,因此您会读一本数学书籍,写成一个叫AL-Khwarizmi的死人。 您意识到一切都是从右到左书写的。 那怎么工作?

因此,也许可选的2D图形库应该具有可选的文本支持?

在多伦多举行的下一次委员会会议上(有人很久以前夏威夷就沉没在大海中),有人试图编写具有网络和大量输入的复杂图形应用程序,并避免使用意大利面条式的代码,他们希望通过某种线程进行某种事件循环。 显然,这是理论上的问题,因为没有输入支持。 从未就如何命名键盘键达成共识。

您回想一下所有现有框架,例如Qt(现在是8.0版),它提供了事件循环,消息传递系统和Unicode字符串类型。 也许他们在做些什么。

在这段时间内,人们继续使用Qt。 人们因了解Qt而被录用。 他们在学校的项目中使用了它。 当然,Qt仍然很烂,因为标准中添加的C ++反射功能永远不足以替代其代码生成器。 但是人们并不在乎它的糟透了。 确实使用QML的人。 或电子。

没有显示

锦上添花:C ++标准库应该包含什么?相关推荐

  1. C 标准库 - ctype.h

    C 标准库 - <ctype.h> 简介 C 标准库的 ctype.h 头文件提供了一些函数,可用于测试和映射字符. 这些函数接受 int 作为参数,它的值必须是 EOF 或表示为一个无符 ...

  2. 2020-11-02C 标准库 - <ctype.h>

    C 标准库 - <ctype.h> 简介 C 标准库的 ctype.h 头文件提供了一些函数,可用于测试和映射字符. 这些函数接受 int 作为参数,它的值必须是 EOF 或表示为一个无符 ...

  3. python标准库有多强大_Python标准库——走马观花

    原文:Python标准库--走马观花 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python的一大好处在于它有一套很有用的标 ...

  4. c++ standard library_什么是C/C++的标准库?

    简要介绍编写C/C ++应用程序的领域,标准库的作用以及它是如何在各种操作系统中实现的. 做为一个从事C/C++多年的程序员,从一开始就让我感到疑惑的是其内部结构:我所使用的内核函数和类从何而来? 谁 ...

  5. Python学习笔记011_模块_标准库_第三方库的安装

    容器 -> 数据的封装 函数 -> 语句的封装 类 -> 方法和属性的封装 模块 -> 模块就是程序 , 保存每个.py文件 # 创建了一个hello.py的文件,它的内容如下 ...

  6. 什么是 C 和 C ++ 标准库?

    我已经接触C++一段时间了,一开始就让我感到疑惑的是其内部结构:我所使用的内核函数和类从何而来? 谁发明了它们? 他们是打包在我系统中的某个地方吗? 是否存在一份官方的C ++手册?今天简要介绍编写C ...

  7. 细数python标准库中低调的模块

    有没有遇到过这种情况,在网络上搜索如何使用Python进行某种操作,最终找到一个第三方库,直到后来发现标准库中包含的模块或多或少都可以满足你的需求.这种情况并不罕见, 整理了一些python标准库中鲜 ...

  8. python标准库os.path中_Python零基础入门学习19:常用标准库之os.path子库

    注:本文所有代码均经过Python 3.7实际运行检验,保证其严谨性. 本文阅读时间约为3~5分钟. os库是Python标准库,包含几百个函数.它能处理与系统相关的常用路径操作.进程管理.环境参数等 ...

  9. 7.Python3标准库--文件系统

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 ''' Python ...

最新文章

  1. bzoj1854: [Scoi2010]游戏
  2. nvidia显卡cuda的性能_性能追平上代万元旗舰!NVIDIA GeForce RTX 3070规格解析
  3. 解决scrollView像素自动下移的办法
  4. 几种排序算法性能的比较
  5. 堰流实验报告思考题_堰流流量系数测定实验
  6. razor 写入html标记,如何在Razor中编写“ Html.BeginForm”
  7. java泛型程序设计——无限定通配符+通配符捕获
  8. 【网络】SSH本地/远程/动态端口转发
  9. 新一代互联网巨头老板,最大方谁抠门?
  10. mysql查询字段数据是否有空格_mysql查询条件字段值末尾有空格也能查到数据问题...
  11. powerdesign165破解以及使用教程
  12. 提醒我 做学问要刨根究底
  13. 融云:让银行轻松上“云”
  14. 国美易卡被曝涉嫌〃高利贷〃,威胁用户把隐私卖给诈骗集团
  15. Cadence仿真笔记:MOS的参数名称解释
  16. C/C++数据结构——虚虚实实(并查集欧拉路)
  17. PS高阶操作之字体特效
  18. ios 扫码枪外设 键盘模式_想把 iPad 当笔记本电脑用?可以试试这款外接键盘
  19. 编程语言的心智负担!你学编程得有多大的压力快来测试一下~
  20. 云计算大数据时代IT管理的机遇和挑战

热门文章

  1. 图灵云服务器,别和一种语言厮守终生:为工作正确选择编程语言
  2. Unity开发-网络.算法.平台相关知识!
  3. mysql 人名用什么类型_数据库中 姓名一般给什么类型?
  4. 程序员电脑族喝什么茶对身体好?
  5. Unable to resolve service for type ‘Movies.Domin.MoviesAccount‘ while attempting to activate ‘Movies
  6. Verilog HDL模块化设计
  7. 使用c通过HTTP接口使用百度翻译API
  8. 自定义webjars
  9. 数据分析笔试——常见概率题(from牛客)
  10. java初学之乘法口诀表