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

来源:1-3 使用带约束的泛型

weixin_慕运维7326594

2022-03-30 10:24:09

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

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

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

写回答

1回答

liuyubobobo

2022-03-30

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


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


继续加油!:)

3
hiuyubobobo
回复
heixin_慕运维7326594
hp>有,但其实加入各种“约束”本身,在我看来并不是 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


继续加油!:)

h022-03-30
共2条回复

算法与数据结构

波波老师5年集大成之作,算法与数据结构系统学习,考试、面试、竞赛通用

2584 学习 · 1062 问题

查看课程