在这一章节,我们从功能特性的角度回顾了 Netty 的整体架构。Netty 有一个简单却不失强大的架构。这个架构由三部分组成——缓冲(buffer),通道(channel),事件模型(event model)——所有的高级特性都构建在这三个核心组件之上。一旦你理解了它们之间的工作原理,你便不难理解在本章简要提及的更多高级特性。 你可能对 Netty 的整体架构以及每一部分的工作原理仍旧存有疑问。如
在这一章节中,我们快速地回顾下如果在熟练掌握 Netty 的情况下编写出一个健壮能运行的网络应用程序。在 Netty 接下去的章节中还会有更多更相信的信息。我们也鼓励你去重新复习下在 io.netty.example 包下的例子。请注意社区一直在等待你的问题和想法以帮助 Netty 的持续改进,Netty 的文档也是基于你们的快速反馈上。 译者注:翻译版本的项目源码见 https://github
基础 名称 功能说明 版本 备注 ft.env 环境变量 1.0.0 ft.base64ToArrayBuffer 将 Base64 字符串转成 ArrayBuffer 对象 1.0.0 ft.arrayBufferToBase64 将 ArrayBuffer 对象转成 Base64 字符串 1.0.0 系统 名称 功能说明 版本 备注 ft.getSystemInfoSync wx.getSys
以下情形时使用 Signals : 你需要健壮的回调时 事件具有多个处理者时 signal 与插槽之间的连接需要在运行时可配置时 Boost.Signals 取代旧有风格的回调现在已经是很清楚了,这个库是当前可用的、最好的 signals/slots 实现之一。这个库所代表的设计模式非常著名,并且已经被研究了很长一段时间,所以这个领域已经非常成熟。一些编程语言已经在语言中直接实现了这种机制,如 .
在以下情形时使用 Function 库 你需要保存一个回调函数或函数对象 你想要从实现中解耦函数调用,例如在GUI和实现间的解耦 你想要保存由 binder 库创建的函数对象,用于后续的调用或多次调用 Boost.Function 是对标准库的功能的重要补充。在回调机制中使用函数指针这样的著名技术被扩充至可以使用任何行为类似于函数的东西,包括由 binder 库创建的函数对象。通过使用 Boost
以下情形时使用 Lambda : 你不想创建一个简单的函数对象 你需要在调用函数时调整参数顺序或 arity 你想就地创建与标准一致的函数对象 你需要灵活并可读的谓词 上述原因只是值得使用本库的几种情形。虽然多数情况下,它会与标准库算法一起用,至少部分原因是由于在其它库(就算是 Boost 库)中这样的设计还不多见。通过函数对象来进行算法配置的需要并不能验证本库的有效性,离完全弄清楚它在哪些地方可
现在来看,王江应该是属于那种成功的大学生。好多人后来都后悔:“四年大学白念了,什么也没学到,什么也没做成。”在他们心目中,大学四年应该像王江那样渡过:一、成绩中上,另外有那么一两门课特别好;二、交际广泛,特别是跟女同学的交际,手机里面全是妹妹的电话,QQ上全是妹妹的头像;三、课余活动丰富,打球、唱歌、泡妞、吃饭喝酒天天都安排得满满的。 高中的时候王江就会弹吉他,那时候绝影天天早上6点钟起床,晚上1
在以下情形时使用 Bind : 你需要绑定一个调用到一个普通函数,使用部分或全部参数 你需要绑定一个调用到一个成员函数,使用部分或全部参数 你需要嵌套组合函数对象 泛化绑定器的存在对于编写简洁、连贯的代码非常有用。它减少了为了适配函数/函数对象以及函数组合而创建的小函数对象的数量。虽然标准库已经提供了 Boost.Bind 的一小部分功能,但是 Boost.Bind 所具有的重大改进使得它在多数情
Tuple 库为C++带来了 tuples 的概念。它是符合直觉和简单明了的,虽然它的主要用途看起来就是用于从函数返回多个返回值,但它也可以用于创建各种逻辑组合,就象在标准库容器中保存一组元素一样。这种方法和为各个不同的返回类型创建一个 struct 是相同的,但后者不仅沉闷,而且不可能作出递归的泛型解决方案。使用 Boost.Tuple 就可以解决这些问题。 在本章中,我们看到了如何使用 Tup
类别联合(discriminated unions)在日常编程中非常有用,这个事实无须惊讶,Boost.Variant 库提供了高效且易用的 variant 类型,它正是基于类别联合的。因为C++的联合对于很多类型很难使用(它只支持内建类型和 POD 类型),长期以来一直需要别的东西来取代它。许多创建类别联合的尝试都存在某些重要的缺点。例如,早期的尝试通常仅支持固定的一组类型,的确妨碍了维护性 和
这个类型可以包含不同类型的值,而且与无类类型(如 void*)有很大不同。我们总是严重地依赖C++中的类型安全,只有在极少数情形下我们会愿意没有它来干活。 这是有很好的原因的:类型安全防止我们犯错,并改善了我们代码的性能。因此,我们应该避免无类类型。还有,发现自己需要异类存储的情形很少见,或者为了将使用者隔离于类型的细节,或者为了在更低的层次获得极度的灵活性。any 提供了这些功能,同时维护了类型
无可争议,正则表达式是非常有用和重要的,而本库给C++带来了强大的正则表达式功能。传统上,用户 除了使用POSIX C API来实现正则表达式功能以外,别无选择。对于文本处理的验证工作,正则表达式比手工编写分析代码要灵活和可靠得多。对于查找和替换,使用正则表达式可 以优美地解决很多相关问题,而不用它们则根本无法解决。 Boost.Regex是一个强大的库,因此不可能在这一章中完全覆盖它所有的内容。
为用户自定义类型提供一组正确的关系操作符和算术操作符是非常重要的,而且正确地实现它也是一个重大 的挑战。通过使用Operators库,这个任务大大地简化了,正确性和对称性也随之而来。除此之外,这个库还提供了一组完整的操作符定义,这些类所支持 的概念被适当地命名和定义,可以在定义你的类时明确这些概念(也是通过Operators库!)。在本章中,我们已经看了几个例子,关于如何使用这个库来 改进带有操作
本章介绍了几种工具类,它们可以大大简化我们的日常工作。BOOST_STATIC_ASSERT 提供编译期断言,它有助于我们测试前提条件或强制某些要求。对于泛型编程,checked_delete 在检查错误用法时非常有用,它可以节省我们大量的阅读可怕的错误信息和研究代码的时间。我们还讨论了 addressof, 它是一个获得对象真实地址的小工具,不用管 operator& 有否被重载。我们还看到了
在这一章里,你学习了 Boost.Conversion 库,从 polymorphic_cast开始。polymorphic_cast 的基本原理是代码的清晰性和安全性,它使我们在代码中更灵活地表达我们的意图,还有安全性,与它的竞争者 dynamic_cast<T*>相比它更为安全,因为对结果指针的测试很容易忘记。 接着,你看到了安全的优化,使用 polymorphic_downcas