本文发表于知乎专栏:https://zhuanlan.zhihu.com/p/78333162
已获得作者授权。
在上一篇文章 zhuanlan.zhihu.com/p/76 中,我介绍多态、静态分发和动态分发的概念,以及他们各自在C++和Rust中的实现方式。
在本文中,我会重点讲Rust中的Trait实现的静态分发与C++ 20(准确的说,现在还叫做C++ 2a)中的concepts的区别。
在具体介绍这个区别之前,我想跟大家介绍一个概念,叫做duck typing(鸭子类型)。
鸭子类型
呃……你没有看错,这个鸭子就是你平常理解的那个鸭子,我也没有翻译错……
鸭子类型[1]是鸭子测试的一个应用:
如果它走起来像鸭子,也跟鸭子一样发出嘎嘎的叫声,那么它就是鸭子
听起来似乎非常无厘头,但这个模式实际上被广泛的应用于多种语言。
在C++中的应用
template <typename T>
concept bool Stream = requires(T a) {
{ a.read(std::uint8_t*, size_t) } -> size_t;
{ a.write(const std::uint8_t*, size