Boost Type Erasure的实践和发现

时间:2013-08-16 08:16:31

标签: c++ boost type-erasure

我正在阅读有关boost type erasure的内容,我正在努力找出潜在的用途。我想读一些关于这个主题的文档(它看起来很大),我想练习一下。引用最多的应用程序区域是在客户端和服务器之间联网/交换数据。 你可以建议一些其他的例子或练习我可以玩这个库吗?

1 个答案:

答案 0 :(得分:18)

类型擦除在非常多的情况下非常有用,实际上它可能被认为是一种基本缺少的语言功能,它可以桥接通用和面向对象的编程风格。

当我们用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是对此的一种微妙的增强,将它从迭代器扩展到范围,但基本思想是相同的。

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