Boost C++ 库

...世界上最受推崇和专业设计的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu,《C++ 编码标准

PrevUpHomeNext

第 38 章。Boost.TypeErasure

Steven Watanabe

根据 Boost 软件许可协议 1.0 版分发。(请参阅随附文件 LICENSE_1_0.txt 或访问 https://boost.ac.cn/LICENSE_1_0.txt

目录

简介
如何阅读本文档
基本用法
组合概念
具有多个参数的函数
概念深入
定义自定义概念
重载
概念映射
关联类型
使用 Any
构造
转换
引用
语法限制
示例
多态范围格式化器
类型安全的 printf
具有多个签名的 Boost.Function
概念定义
预定义概念
参考
头文件 <boost/type_erasure/any.hpp>
头文件 <boost/type_erasure/any_cast.hpp>
头文件 <boost/type_erasure/binding.hpp>
头文件 <boost/type_erasure/binding_of.hpp>
头文件 <boost/type_erasure/builtin.hpp>
头文件 <boost/type_erasure/call.hpp>
头文件 <boost/type_erasure/callable.hpp>
头文件 <boost/type_erasure/check_match.hpp>
头文件 <boost/type_erasure/concept_interface.hpp>
头文件 <boost/type_erasure/concept_of.hpp>
头文件 <boost/type_erasure/config.hpp>
头文件 <boost/type_erasure/constructible.hpp>
头文件 <boost/type_erasure/deduced.hpp>
头文件 <boost/type_erasure/derived.hpp>
头文件 <boost/type_erasure/dynamic_any_cast.hpp>
头文件 <boost/type_erasure/dynamic_binding.hpp>
头文件 <boost/type_erasure/exception.hpp>
头文件 <boost/type_erasure/free.hpp>
头文件 <boost/type_erasure/is_empty.hpp>
头文件 <boost/type_erasure/is_placeholder.hpp>
头文件 <boost/type_erasure/is_subconcept.hpp>
头文件 <boost/type_erasure/iterator.hpp>
头文件 <boost/type_erasure/member.hpp>
头文件 <boost/type_erasure/operators.hpp>
头文件 <boost/type_erasure/param.hpp>
头文件 <boost/type_erasure/placeholder.hpp>
头文件 <boost/type_erasure/placeholder_of.hpp>
头文件 <boost/type_erasure/rebind_any.hpp>
头文件 <boost/type_erasure/register_binding.hpp>
头文件 <boost/type_erasure/relaxed.hpp>
头文件 <boost/type_erasure/require_match.hpp>
头文件 <boost/type_erasure/same_type.hpp>
头文件 <boost/type_erasure/static_binding.hpp>
头文件 <boost/type_erasure/tuple.hpp>
头文件 <boost/type_erasure/typeid_of.hpp>
理论基础
为什么我必须显式指定析构器的存在?
为什么是非成员函数?
为什么占位符被称为 _a_b 而不是 _1 _2
为什么不使用 boost::ref 来表示引用?
未来工作
致谢
相关工作

Boost.TypeErasure 库在 C++ 中提供了比核心语言提供的更灵活的运行时多态性。

C++ 有两种不同类型的多态性:虚函数和模板,每种都有其自身的优点和缺点。

  • 虚函数在运行时才解析,而模板总是在编译时解析。如果您的类型可以在运行时变化(例如,如果它们依赖于用户输入),那么使用模板的静态多态性就没什么帮助。
  • 虚函数可以与单独编译一起使用。模板的主体必须在每个使用它的翻译单元中都可用,这会减慢编译速度并增加重建次数。
  • 虚函数自动使对参数的要求变得明确。模板仅在实例化时才进行检查,这需要在测试、断言和文档中进行额外的工作。
  • 编译器每次实例化函数模板时都会创建一个新的副本。这允许更好的优化,因为编译器静态地知道所有内容,但也导致二进制文件大小显着增加。
  • 模板支持值语义。“行为类似于 int”且不共享的对象更容易推理。另一方面,要使用虚函数,您必须使用(智能)指针或引用。
  • 模板库可以允许第三方类型以非侵入方式进行适配,以实现无缝互操作性。使用虚函数,您必须创建一个从基类继承的包装器。
  • 模板可以处理涉及多种类型的约束。例如,std::for_each 接受一个迭代器范围和一个可以对范围元素调用的函数。虚函数实际上无法表达这种约束。

Boost.TypeErasure 库结合了模板的卓越抽象能力和虚函数的运行时灵活性。

Boost 包括几种这种多态性的特殊情况

  • boost::any 用于 CopyConstructible 类型。
  • boost::function 用于可以像函数一样调用的对象。
  • Boost.Range 提供了 any_iterator

Boost.TypeErasure 将其推广以支持任意需求,并提供了一组 预定义的常用概念


PrevUpHomeNext