最新公告
  • 欢迎您光临欧资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • 通过为每种使用的类型量身定制模板,而不是作为一个概念

    为什么 C++ STL 如此依赖模板? (不在 *interfaces* 上)

    问题描述:

    我的意思是,除了它的强制性名称(标准模板库)…

    C 原本打算将 OOP 概念引入 C

    。也就是说:您可以根据其类和类层次结构(无论它如何做)来判断特定实体可以做什么和不能做什么。由于多重继承问题,而 C 以一种笨拙的方式(与

    java 等)支持接口的概念,某些功能组合更难以以这种方式描述,但它就在那里(并且可能是一种改进)。

    然后模板与 STL 一起工作。 STL 似乎采用了经典的 OOP 概念并将其淡化,而是使用模板。

    当使用模板泛化类型时,类型本身与模板的操作无关(例如容器),应区分这些情况。拥有一个向量非常有意义。

    但是,在许多其他情况下(迭代器和算法),模板化类型应该遵循一个“概念”(输入迭代器、前向迭代器等),其中概念的实际细节完全由模板的实现定义函数/类而不是与模板一起使用的类型的类,这有点正确

    OOP 的反义词。

    例如,你可以告诉函数:

    void MyFunc(ForwardIterator *I);
    

    更新:由于原始问题中并不清楚载是什么结构标准答案,ForwardIterator 可以自己模板化以允许任何 ForwardIterator 类型。相反,把

    ForwardIterator 作为一个概念。

    要仅通过查看其定义来期望 Forward Iterator,您需要查看以下实现或文档:

    template  void MyFunc(Type *I);
    

    我可以提出两个支持使用模板的论点:为每种使用类型定制模板,而不是使用

    vtables,它可以使编译后的代码更有效率。而且模板可以与原生类型一起使用。

    但是载是什么结构标准答案,我正在寻找更深层次的原因,为什么要放弃经典的 OOP 以支持在 STL 中进行模板化? (假设你读了这么远:P)

    答案 1:

    简短的回答是“因为 C++ 已经向前发展了”。是的,早在 70 年代后期,Stroustrup 就打算创建一个支持 OOP 的升级

    C,但那是很久以前的事了。到 1998 年语言标准化时,它不再是 OOP 语言。这是一种多范式语言。当然是面向对象的

    代码有一些支持,但它也涵盖了图灵完备的模板语言,它允许编译时元编程,并且发现了泛型编程。突然,哎呀

    载是什么结构标准答案_载是什么结构标准答案_水绵载色条结构示意图

    这似乎不再那么重要了。当我们使用模板和泛型编程提供的技术可以编写更简单、更简洁和更高效的代码时,情况就不是这样了。

    OOP 不是圣杯。这是 70 的一个好主意

    与 1990 年代发明的过程语言相比,这是一个相当大的改进。但老实说,这还不是全部。在许多情况下,它既笨拙又冗长,并且并没有真正促进可重用代码或模块化。

    这就是今天 C++ 社区对泛型编程更感兴趣的原因,也是为什么大家终于开始意识到函数式编程也很聪明的原因。 OOP 本身并不漂亮。

    尝试映射假设的“OOP 化”STL 的依赖关系。有多少类必须相互认识?会有很多

    视情况而定。你可以只包含向量头而不需要迭代器甚至 iostream 来拉入吗? STL

    让这一切变得简单。向量知道它定义的迭代器的类型,仅此而已。 STL算法什么都不知道

    。它们甚至不需要包含迭代器标头,即使它们都接受迭代器作为参数。那么哪个更模块化?

    STL 可能不遵循 Java 定义的 OOP 规则,但它不符合 OOP 的目标吗?可重用性、低耦合性、模块化和封装性不是做到了吗?

    实现这些目标不是比 OOP 化版本更好吗?

    至于为什么 STL 被采用到语言中,发生了几件事导致了 STL。

    首先,模板被添加到 C++ 中。添加它们的原因与将泛型添加到 .NET 中的原因大致相同。能够写出诸如“T

    之类的东西

    不丢掉类型安全的东西

    type container” 似乎是个好主意。当然,他们确定的实现要复杂得多,功能强大得多。

    然后人们发现他们添加的模板机制比预期的更强大。有些人开始尝试使用模板来编写更通用的库。一种受到函数式编程的启发,另一种则使用了 C++ 的所有新特性。

    他把它介绍给了 C++ 语言委员会,因为它看起来很奇怪和不同,所以花了很长时间才习惯它,但最终意识到它比他们必须包含的传统 OOP 等价物更好

    。所以他们对其进行了一些调整,并将其放入标准库中。

    这不是意识形态的选择,也不是“我们要不要做OOP”的政治选择,而是非常务实的选择。他们评估了这个库,发现它运行良好。

    无论如何,你提到的支持STL的两个理由都是绝对必要的。

    C++ 标准库必须高效。如果它比等效的手动 C 代码效率低,人们就不会使用它。这会降低工作效率,增加出错的机会,而且总体而言是个坏主意。

    STL 必须使用原始类型,因为原始类型是 C 中的一切,它们是两种语言的主要部分。如果 STL 不适用于原生数组,那就没用了。

    您的问题强烈假设 OOP 是“最好的”。我很想知道为什么。你问他们为什么他们“放弃了经典的 OOP”。我想知道他们为什么要坚持下去。会有什么优势?

    下一节:禁止所有文件使用 Nginx 403

    我在 CentOS 5 机器上安装了带有 PHP-FPM 的 nginx,但我无法让它为我的任何文件提供服务 – 无论是否是 PHP。 Nginx 运行为 www-data:www-data,默认为“We …

    站内大部分资源收集于网络,若侵犯了您的合法权益,请联系我们删除!
    欧资源网 » 通过为每种使用的类型量身定制模板,而不是作为一个概念

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    欧资源网
    一个高级程序员模板开发平台

    发表评论