【问题标题】:practice and discovery of Boost Type ErasureBoost Type Erasure的实践与发现
【发布时间】:2013-08-16 08:16:30
【问题描述】:

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

【问题讨论】:

  • accu.org/var/uploads/journals/Overload116.pdf 的第 16 页有一篇关于使用类型擦除的动态 C++ 的文章
  • 我正在阅读它。感谢您的建议。
  • 我会说对于网络,经典的运行时多态性比类型擦除更合适。不过,类型擦除非常适合处理 std::shared_ptr 中的删除器和分配器。

标签: c++ boost type-erasure


【解决方案1】:

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

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

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

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

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

简而言之,任何时候你需要从多个types 和一个类似的interface 到一个type 和一个interface,你将需要某种形式的类型擦除。它是等同于编译时模板的运行时技术。

【讨论】:

  • 嗨。同时,作为参考,我还阅读了 Thomas Becker artima.com/cppsource/type_erasure.html thbecker.net/free_software_utilities/… 的以下内容
  • 两个很好的资源,但我想你可能想知道除anyany_iteratorany_container 之外的类型擦除更普遍的需求。就像成员函数指针只存在于实现委托一样,虚函数的存在可能主要是为了允许类型擦除。这是一个概念的基础。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
  • 2021-12-17
  • 2020-06-20
  • 2021-06-25
  • 2012-11-01
  • 2014-12-21
相关资源
最近更新 更多