7

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

4

1 回答 1

19

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

当我们在 C++ 中定义一个类时,我们真正定义的既是一个非常具体的,type又是一个非常具体的interface,并且这两个东西不一定需要关联。Atype处理数据,而 asinterface处理该数据的转换。通用代码,例如 STL 中的代码,并不关心type,它关心的是interface:您可以使用 对任何容器或类似容器的序列进行排序std::sort,只要它提供比较和迭代器即可interface

不幸的是,C++ 中的通用代码需要编译时多态性:templates. 这对于直到运行时才能知道的事情或需要统一接口的事情没有帮助。

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

any_iterator这样做的另一个非常有用的理由是:如果您需要使用相同的接口迭代多个不同的容器,则需要将type容器的 擦除 出type迭代器。boost::any_range 是对此的一种微妙增强,将其从迭代器扩展到范围,但基本思想是相同的。

简而言之,任何时候你需要从 multiple typeswith a similar interfaceto a single typewith a single interface,你将需要某种形式的类型擦除。它是等同于编译时模板的运行时技术。

于 2014-02-20T11:13:01.317 回答