关于C++中带约束的泛型

关于C++中带约束的泛型

老师您好,在本章学的排序里,使用Java泛型时,使用了带约束的泛型

 public static <E extends Comparable<E>> void sort(E[] arr)

同时,我想尝试使用C++来学习编写算法。想问一下您,在C++中,应该如何处理这种带约束的泛型呢?期待您的回复。

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

在 C++ 20 之前,C++ 没有语法层面的泛型约束。C++ 20 添加的新特性 concept 是用于做泛型约束的。


关于 concept 的使用方式的详细介绍,可以参考这里:https://en.cppreference.com/w/cpp/language/constraints


继续加油!:)

  • 谢谢老师。那如果没有泛型约束的情况下,通常是如何解决这种问题的呢,是否有其它的方法?

    2022-03-30 16:31:21
  • liuyubobobo 回复 提问者 weixin_慕运维7326594 #2

    有,但其实加入各种“约束”本身,在我看来并不是 C/C++ 的风格。C/C++ 本身就是在靠“少约束”来换取灵活性和性能,如果有需要,让开发者处理相应的问题。(还有人说 C/C++ 的风格就是:完全相信开发者。所以不在语言层面做多余的 bug-free 的特性设置。)


    所以 C/C++ 连最基本的数组越界都不做编译层面的检查;再比如允许传入真正的引用(就是地址,相较而言,Java 中所谓的引用只是 C/C++ 中的指针而已);可以多继承;父类中的函数默认不是 virtual;不负责自动垃圾回收机制(当然你可以自己写智能指针);等等等等。对 C++ 理解的越深入,就会明白,C++ 比 Java 灵活太多。但相应的代价就是,程序员要处理的问题更多。也正是因为这种灵活性,在 C++ 的世界中存在很多“技巧”(而非语言本身提供的处理问题的方式。)


    泛型约束的本质其实是在对泛型的特性做编译层面的检查而已。这样的检查可以“绕个弯子”进行,这个文档的这一部分提供了很多思路:https://www.stroustrup.com/bs_faq2.html#constraints 

    (P.S. 如果你对 C++ 感兴趣,这整份文档都值得认真阅读。C++ 之父的经验之谈。)


    另外,当你开始认真对待 C++ 的 templates 的时候,其实来到了一个深不见底的新世界中。当我们深入理解 C++ 的时候,templates 是一个绕不开的话题。如果你对理解 C++ 的 templates 是认真的,这本书或许是当下介绍这一方面的圣经:https://www.amazon.com/C-Templates-Complete-Guide-2nd/dp/0321714121/ref=sr_1_1?keywords=c%2B%2B+templates+the+complete+guide&qid=1648631977&sprefix=c%2B%2B+templates+%2Caps%2C159&sr=8-1


    继续加油!:)

    2022-03-30 17:23:46
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
算法与数据结构
  • 参与学习       2583    人
  • 解答问题       1082    个

慕课网算法名师Liuyubobobo,5年集大成之作 从0到工作5年,算法与数据结构系统解决方案

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师