我正在阅读boost type erasure
并试图找出潜在的用途。在阅读有关该主题的大量文档时,我想练习一下(看起来很大)。引用最多的应用程序领域是客户端和服务器之间的网络/交换数据。你能推荐一些其他的例子或练习,我可以用这个库玩我吗?
1 回答
类型擦除在非常多的情况下很有用,以至于它实际上可能被认为是一种基本缺失的语言特性,它连接了通用和面向对象的编程风格。
当我们在 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 types
with a similar interface
to a single type
with a single interface
,你将需要某种形式的类型擦除。它是等同于编译时模板的运行时技术。