C++:你在使用 Loki 还是 Boost 作为函子?

Posted

技术标签:

【中文标题】C++:你在使用 Loki 还是 Boost 作为函子?【英文标题】:C++: Are YOU using Loki or Boost for functors ? 【发布时间】:2011-03-08 17:31:28 【问题描述】:

我一直在阅读 Alexandrescu 的书《现代 C++ 设计》,他使用的技术给我留下了深刻的印象,因此我想将 Loki library 添加到我的应用程序中。

但是,经过进一步调查,我发现我已经在使用的 boost 提供了许多类似的功能(尽管不是全部,例如,我在 boost 中找不到单例)

由于基于策略的设计和仿函数,我最感兴趣的是使用 loki。

对我来说,boost 和 loki 各有利弊。我对 loki 的主要担忧是糟糕的文档(图书馆不再与书绑定),但在我看来,loki 在某些领域比 boost 更强大和灵活(我可能在那个方面错了)

在选择将 boost 或 loki 用于函子和策略之前,我想知道在现实生活中使用它们的人的意见。

有时在纸面上看起来很不错,但实际使用时却有一些缺点:)

【问题讨论】:

没有单例是 Boost 的优点之一。世界最不需要的就是鼓励使用更多单例。 【参考方案1】:

Alexandrescu 有非常有趣的想法(类型列表、基于策略的类模板等),但其中很多都在 boost 中得到了改进,并在更广泛的编译器中进行了可移植性和正确性测试。

出于这些原因,我建议尽可能选择 boost。尽管如此,现代 C++ 设计仍然对 C++ 的灵活性提供了很多洞察力,并深入了解了一个人的思维(非常好的思维)以解决许多常见的编程问题。

例如,基于策略的智能指针是一个非常巧妙的想法,但我们可以找到为什么 boost 作者选择不以这种方式实现 shared_ptr 和 scoped_ptr:

A.参数化不鼓励用户。 shared_ptr 模板是小心翼翼的 精心设计,以满足共同的需求,而无需 广泛的参数化。某天 高度可配置的智能指针可能 被发明出来也很容易 使用并且很难误用。直到 那么,shared_ptr 就是智能指针 广泛的选择 应用程序。 (有兴趣的人 基于策略的智能指针应该 阅读 Andrei 的 Modern C++ Design 亚历山大雷斯库。)

如果您确实需要各种各样的智能指针,并且您和您的团队习惯于广泛使用模板参数化,那么实现智能指针的基于策略的方法可能适合您。但是,scoped_ptr 和 shared_ptr(连同weak_ptr)往往会非常彻底地完成这项工作。策略类的组合行为可能更适合用于具有多种有用组合的事物。

尽管如此,Alexandrescu 仍有一些有趣的提议,但 boost 尚未解决。例如,MOJO 仍然非常有用,直到编译器更好地实现移动构造函数,或者直到我们可以使用 C++0x 中的右值引用。他对实现内存分配器也有一些非常有趣的想法。

至于问题,我们在商业项目中使用了 mojo 所需的部分 Loki,但主要是在适当的时候进行增强。

【讨论】:

【参考方案2】:

可能要考虑的一件事是,boost 库在接受期间必须经过同行评审过程。当然,在那之后,我相信对发生的变化几乎没有监督,但至少在它们被接受之前会有一些审查。洛基只是一个人的愿景。当然 Alexandrescu 相当不错,但仍然......这都是他的想法,没有比这更进一步的评论了。

【讨论】:

【参考方案3】:

我在整个 C++ 环境中使用 Boost,就像对标准库的扩展(使用 VC9 和 VC10)。

我不会在所有项目中使用它。

我在个人项目(主要是游戏)中使用它,我可以完全控制依赖关系。

我在一个大型游戏项目中使用 boost::function(与 boost 中的其他几个库)。

Loki 也不错,但我觉得没必要。我认为我正在考虑使用的库的唯一部分是单例,但我正在使用目前足够好的自定义库。

【讨论】:

【参考方案4】:

C++0x 是我用于快速函数对象的。

【讨论】:

如果我错了,请纠正我,但是 gcc 和 Visual Studio 2008 都不完全支持 C++0x,或者是吗? @Dinaiz:您可以获得最新版本的 GCC,其中包含大量 C++0x,包括我相信的 lambda。 VS2008 没有,但您没有在问题中指定编译器。 是的,这是真的,我没想到答案会涉及到取决于编译器的东西:) @DeadMG :"VS2008 has none" 你错了,vs2008 支持 TR1 表示数组、正则表达式、unordered_set/map、元组、shared_ptr std::function (连同 bind 和 mem_fn) 是的,但是大部分 TR1 是 C++0x 的一部分,所以 TR1 可以被“视为”为子集或 C++0x

以上是关于C++:你在使用 Loki 还是 Boost 作为函子?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Loki 库没有得到更广泛的使用?

如何使用 boost::tokenizer 作为 C++ 类成员?

C++使用boost 1.75版本来读写JSON文件

C++设计模式类库 Loki介绍与用法

C++ 三大库boostlokistlport

C++ Boost - 序列化错误 - 将“const B”作为“this”参数传递会丢弃限定符