Boost类型擦除的实践和发现

practice and discovery of Boost Type Erasure

本文关键字:发现 类型 擦除 Boost      更新时间:2023-10-16

我正在阅读关于boost type erasure的文章,并试图找出潜在的用途。我想在阅读大量关于这个主题的文档时练习一下(它看起来很大)。应用程序中引用最多的领域是在客户端和服务器之间建立网络/交换数据。你能推荐一些其他的例子或练习吗?我可以用这个库玩我的游戏?

Type Erasure在很多情况下都很有用,以至于它实际上可能被认为是一个根本缺失的语言功能,它连接了通用和面向对象的编程风格。

当我们在C++中定义一个类时,我们真正定义的是一个非常特定的type和一个非常具体的interface,这两件事不一定需要关联。type处理数据,其中interface处理数据上的转换。泛型代码,如STL中的代码,不关心type,它关心interface:您可以使用std::sort对任何容器或类似容器的序列进行排序,只要它提供比较和迭代器interface

不幸的是,C++中的泛型代码需要编译时多态性:templates。对于在运行时之前无法知道的事情,或者需要统一接口的事情,这都没有帮助。

一个简单的例子是:如何在一个容器中存储许多不同的类型?最简单的机制是将所有类型存储在一个void*中,也许可以使用一些类型信息来区分它们。另一种方法是识别所有这些types具有相同的interface:检索。如果我们可以为retrieval制作一个单独的接口,然后为每种类型专门化它,那么就好像type的一部分已经被擦除了一样。

any_iterator是这样做的另一个非常有用的原因:如果您需要在具有相同接口的多个不同容器上进行迭代,则需要从迭代器的type中擦除容器的type。boost::any_range是对它的一个微妙的增强,将它从迭代器扩展到范围,但基本思想是一样的。

简而言之,每当您需要从具有类似interface的多个types到具有单个interface的单个type时,都需要某种形式的类型擦除。运行时技术等同于编译时模板。