Boost类型擦除的实践和发现
practice and discovery of Boost Type Erasure
我正在阅读关于boost type erasure
的文章,并试图找出潜在的用途。我想在阅读大量关于这个主题的文档时练习一下(它看起来很大)。应用程序中引用最多的领域是在客户端和服务器之间建立网络/交换数据。你能推荐一些其他的例子或练习吗?我可以用这个库玩我的游戏?
Type Erasure在很多情况下都很有用,以至于它实际上可能被认为是一个根本缺失的语言功能,它连接了通用和面向对象的编程风格。
当我们在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是对它的一个微妙的增强,将它从迭代器扩展到范围,但基本思想是一样的。
简而言之,每当您需要从具有类似interface
的多个types
到具有单个interface
的单个type
时,都需要某种形式的类型擦除。运行时技术等同于编译时模板。
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 字符串C :libc abi.dylib:终止未被发现的类型std :: out_of_range:basic
- 如果在类型INT矢量中发现了重复,则C 返回true
- Boost类型擦除的实践和发现
- c++类型擦除/类型封装?发现类型
- 在模板中发现对象的类型