C++ Boost型擦除的实践与发现

C++ Boost型擦除的实践与发现,c++,boost,type-erasure,C++,Boost,Type Erasure,我正在阅读有关boost-type擦除的文章,并试图找出其潜在用途。我想在阅读大量关于这个主题的文档时练习一下(它看起来很重要)。应用程序中引用最多的领域是在客户端和服务器之间联网/交换数据。 你能推荐一些其他的例子或练习,我可以在这个库中使用I bit吗?类型擦除在非常多的情况下非常有用,以至于它实际上可能被认为是一种基本上缺失的语言功能,可以连接通用和面向对象编程风格 当我们在C++中定义一个类时,我们真正定义的是一个非常具体的类型和一个非常具体的接口,并且这两个事物不一定需要相关。类型处理

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

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

当我们在C++中定义一个类时,我们真正定义的是一个非常具体的类型和一个非常具体的接口,并且这两个事物不一定需要相关。

类型
处理数据,其中作为
接口
处理该数据的转换。通用代码(如STL中的代码)不关心
类型
,它关心
接口
:您可以使用
std::sort
对任何容器或类似容器的序列进行排序,只要它提供比较和迭代器
接口

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

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

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


简而言之,当您需要从具有类似
接口的多个
类型
转换为具有单个
接口的单个
类型
时,您将需要某种形式的类型擦除。运行时技术等同于编译时模板。

页16FF有一篇关于DyaMcC++的文章,它使用的是Erasuri AM。谢谢你的建议。我想说,对于网络来说,经典的运行时多态性比类型擦除更合适。不过,类型擦除对于处理
std::shared_ptr
中的删除程序和分配器非常有用。同时,为了便于参考,我还阅读了Thomas Becker的以下两篇文章,这两篇文章都是优秀的参考资料,但我想您可能希望知道,除了
any
any\u迭代器
any\u容器
之外,还需要更多的类型擦除。正如成员函数指针的存在只是为了实现委托,虚拟函数的存在可能主要是为了允许类型擦除。这是一个概念的基础。