微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Hana 通过标签调度来定制行为的机制能否被视为一种适配器模式?

如何解决Hana 通过标签调度来定制行为的机制能否被视为一种适配器模式?

tl;博士

boost::hana::transformstd::vector 定制(通过为标签boost::hana::tranform_impl 专门化ext::std::vector)是一种适配器模式 将 STL 的 std::transform 包装到 Hana 的接口函数 boost::hana::transform 中?

为什么要问这个问题

我正在阅读 Dive into Design Patterns,但我有点担心这个资源,就像我一直在窥视的任何其他资源(包括 Head First - Design Patterns)一样,没有一个页面,甚至可能不是一个段落,不包含 inheritance/virtual/extend/ 等词,就像继承一样理解和使用设计模式的唯一途径。

为了减少对这些臭名昭著的模式的继承偏见的理解,我试图从其他角度看待它们,通过询问它们在像 Haskell 这样的函数式编程语言中的样子(例如 {{3 }}),或者,对于目前的问题,如果在使用大量模板元编程(例如 this question)的库中使用这种模式。

问题

如果您查看 Boost.Hana,有一些(已注释的)代码可以按照 Hana 定义的方式使 std::vector 成为函子,即通过专门用于 {{1} 的 transform_impl 模板}}(嗯,实际上对于与任何 std::vector 相关联的标签 ext::std::vector)。

专业化显然诉诸std::vector<T>(和一些模板技巧/std::transform)来完成工作。

然而,最终效果是,如果我取消注释该代码,那么我就可以在 enable_if 上使用 boost::hana::transform,如果不取消该代码的注释,我就无法做到这一点。

另一方面,无论我是否拥有 std::vectorstd::vector 在概念上都是一个函子。实际上,boost::hana::transform 存在于 STL 中,“唯一”的缺点是它不能以函数方式使用,因为它是基于迭代器的。

因此,在我看来,为 std::transform 定制 boost::hana::transform(通过为标签 std::vector 专门化 boost::hana::tranform_impl)有点像将 STL 接口适配到函子, ext::std::vector,到 Hana 的界面,std::transform

这是一个有效的解释吗?

代码

/usr/include/boost/hana/ext/std/vector.hpp 是受 Here 启发的用例和解决方案。

linked open source book 与我使用(希望正确) Hana 方法解决它的用例相同。既然它解决了同样的问题,我很想自我回答,这确实是适配器模式的一种情况。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?