为啥 Loki 库没有得到更广泛的使用?
Posted
技术标签:
【中文标题】为啥 Loki 库没有得到更广泛的使用?【英文标题】:Why is the Loki library not more widely used?为什么 Loki 库没有得到更广泛的使用? 【发布时间】:2011-01-21 19:56:19 【问题描述】:Loki 库实现了一些非常广泛使用的概念(智能指针、访问者、工厂等)。相关书籍《Modern C++ Design》经常被提及,但库本身并没有被广泛使用。这是为什么呢?
大多数开发人员似乎更喜欢 Boost。特别是,为什么人们经常决定使用 Boost 的智能指针而不是 Loki 的?
【问题讨论】:
没有人需要带有 6 个模板参数的智能指针。 Loki 在发布时臭名昭著,无法被任何主流编译器编译。亚历山德雷斯库是个聪明人。对我来说太聪明了。 @johannes:大多数模板参数都有默认值,因此您不必设置它们。你可以只使用 typedef 来绑定一些模板参数。 事实上,弗兰克,您特别不能使用 typedef 来绑定 一些 模板参数——从 C++03 开始 typedef 必须指定所有模板参数。 @ribond:哦,对了,我忘了你不能有模板化的 typedef。我认为这是一个真正的语言失败。 (虽然我知道有解决方法。) 【参考方案1】:Loki 是一种研究/概念验证的东西。 Alexandrescu 推动新的想法,其他人将这些想法用于现实世界。 boost::shared_ptr
也几乎在 TR1 中。
【讨论】:
【参考方案2】:Loki 的缺点是它是一个涉及多个功能领域的优秀库(模板元编程支持一些特定应用程序:智能指针、单例、函数对象、范围保护等),而 boost 是许多库的集合,通常详尽地涵盖每个功能区域和更高的可移植性调整(第一)。
当 10 只鸟中有 9 只可以用同一块石头杀死时,很多人只是从 boost 开始,然后用第三方库来填补空白。如果重叠,很难与 boost 竞争。因为您不会与很多 boost 重叠,所以人们无论如何都会下载/安装 boost 以获得其他功能,所以除非您确定 boost 薄弱的领域 - 并且差异对项目很重要,他们会“解决" 也用于提升那里。
此外,Alexandrescu 多次尝试让 Loki 加入 boost,但一些关键的 boost 作者并不合作。我个人的观点是,他们希望更完整但更不友好的MPL 拥有更多的“市场份额”:作为图书馆的作者和作为唯一体面文档的硬拷贝书籍(与大多数人形成鲜明对比)其他具有出色在线文档的 boost 库),他们在这方面做得很好。
如果有人被这个分析冒犯或不同意,我会全力以赴。
极度参数化代码的另一个实际问题是,在不同开发人员/团队独立工作的大型项目中,他们通常会非常随意地使用相同模板的细微不同实例化。这使得在这些子系统之间传递值变得更加困难:接收器可能需要:
进行参数化(即模板化,因此内联,这会在企业级系统中引入编译依赖性和较慢的构建) 为所有可能的实例提供一些最小覆盖(例如检查错误代码和预期/处理异常) 基于抽象基础访问器(每个实例化的实现)通过一些编译时到运行时切换)这会损害参数化的一些性能优势这一切皆有可能,但需要一位出色的程序员才能驾驭地形。
【讨论】:
这正是 boost 的问题,boost 是 C++ 标准库还是应该是,因为当前的标准库不适合任何人......这就是 C++ 被 Java 和 C# 等语言抛弃的原因,因为标准库非常丰富。更不用说 Java 和 C# 都允许根据需要插入其他库,因为它们有很好的接口可以扩展。【参考方案3】:您想使用下一个程序员会知道并且将来会得到很好支持的库 - 所以您选择一个主要的库。 因为它是一个主要的库,很多人都在使用它,所以它成为默认选择。
【讨论】:
【参考方案4】:我实际上更喜欢 Loki 的做事方式,并且我自己为 Loki 贡献了一个装饰器模式,该模式现在位于跟踪器中,因为据我所知,该项目不再维护。 我使用 boost shared_pointer 只是因为它很快就会成为标准,我可能不喜欢这样一个事实,即我无法自定义它以完全按照我想要的方式运行,但我必须忍受它。 标准库的使用很重要,因为它使其他程序员可以维护代码。如果它是开源的,并且您想进行实验,请继续使用 Loki。没有人阻止你。 实际上,Windows Vista 使用了 Loki 的一些功能。 我猜他们没有使用智能指针和访问者的冗余实现。
【讨论】:
【参考方案5】:作为一个使用过很多 Boost 库并且不止一次看过 Loki 的人来说,最大的问题是文档的稀疏性。此外,Loki 使用了一些 C++ 模板中最复杂的部分。令人兴奋的东西,但也相当令人生畏。
【讨论】:
“Loki 使用了一些 C++ 模板中最毛骨悚然的部分” - Boost 也是如此,还是我误解了什么? 参见shared_ptr
常见问题解答:参数化不鼓励用户。 shared_ptr 模板经过精心设计,无需大量参数化即可满足常见需求。有一天,可能会发明一种高度可配置的智能指针,它也非常易于使用且很难误用。在此之前,shared_ptr 是各种应用程序的首选智能指针。 (那些对基于策略的智能指针感兴趣的人应该阅读 Andrei Alexandrescu 的 Modern C++ Design。)
@litb:正如我在 IRC 上所说,我不同意。我觉得使用 loki 的智能指针比使用 boost 的智能指针更自然。如果我想在 loki 的智能指针上锁定互斥锁,我只需要为它输入一个互斥类。 Loki 的智能指针是我发现的最通用的解决方案。它有时使使用更容易。【参考方案6】:
我曾经将 Loki 用作一个小工具(基本上是一个解释器),并且非常喜欢它。我的同事对这个库不太感兴趣,所以它的使用仍然受限于这个小子项目。
【讨论】:
以上是关于为啥 Loki 库没有得到更广泛的使用?的主要内容,如果未能解决你的问题,请参考以下文章
为啥在另一个 Typescript 项目中导入时没有得到导出的对象?