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
继续加油!:)