Boost库

时间:2020-03-06 14:52:52  来源:igfitidea点击:

自从我开始使用此网站以来,我一直在听关于Boost库的信息。我想知道Boost库的主要优点是什么(因此我为什么要使用它)以及Boost库的可移植性如何?

解决方案

Boost是C ++库的集合。 C ++ 0x的tr1中包含其中的10个。

我们可以在此处开始增强。

我们将获得C ++ 0x的许多新功能。但是除了这种通用性之外,一些更好的细节是一个简单的正则表达式库,一个用于从字符串到整数的转换库(词法转换):

int iResult = 0;
try
{
    iResult = lexical_cast<int>("4");
}
catch(bad_lexical_cast &)
{
    cout << "Unable to cast string to int";
}

日期/时间库等

using namespace boost::gregorian;
date weekstart(2002,Feb,1);
date thursday_next = next_weekday(weekstart, Thursday); // following Thursday

还有一个Python接口(Boost Python),一个词法分析器/解析器DSL(Boost Spirit):

// A grammar in C++ for equations
group       = '(' >> expression >> ')';
factor      = integer | group;
term        = factor >> *(('*' >> factor) | ('/' >> factor));
expression  = term >> *(('+' >> term) | ('-' >> term));

那只是在刮擦表面...

Boost是(通常)通用结构的非常广泛的库,可以在几乎所有应用程序中提供帮助。这可以通过C ++ 0x规范中包含许多Boost组件这一事实来证明。

它也可以至少在主要平台上移植,并且应该可以通过几乎符合标准的C ++编译器移植到几乎所有产品上。

唯一的警告是,boost库之间可能存在很多混杂的依赖关系,这使得仅选择要分发的特定组件(而不是整个boost库)更加困难。

我们可以简单地阅读Boost背景信息页面,以快速了解为什么应该使用Boost及其用途。值得花几分钟的时间。

Boost由标准委员会的几名成员组织。
因此,这是将成为下一个标准的图书馆的温床。

  • 它是STL的扩展(它填充了遗漏的位)
  • 有据可查。
  • 经过同行评审。
  • 它具有很高的活动性,因此可以迅速发现并修复错误。
  • 它是平台无关的,可在任何地方使用。
  • 它是免费使用的。

随着tr1即将推出,很高兴知道boost已经覆盖了很多领域。 tr1中的许多库基本上都直接从boost原版改编而来,因此已经过尝试和测试。不同之处在于它们已移入std :: tr1命名空间(而不是boost)。

我们需要做的就是将以下内容添加到编译器的默认包含搜索路径中:

<boost-install-path>/boost/tr1/tr1

然后,当我们包含标准头文件时,boost将自动将所有必需的内容导入名称空间std :: tr1

例如:

要使用std :: tr1 :: share_ptr,我们只需要包含<memory>。这将为我们提供一个文件的所有智能指针。

Boost是高质量的同行评审C ++库的集合,这些库着重于可移植性和正确性。它为该语言和标准库的新增功能提供了事实证明。请访问他们的网站以获取更多详细信息。

Boost的优势:
它广泛可用,可移植到任何现代C ++编译器或者任何平台。
这些功能与平台无关,我们不必为每个新框架学习新的线程设计。
它以标准方式封装了许多platfom特定的功能,例如文件系统。

这就是C ++应该附带的东西! Java的很多流行之处是标准库附带了Java,它可以做很多我们想做的事。不幸的是,C ++仅继承了有限的C / Unix标准功能。

99%可移植。

我要说的是,一旦我们发现可以通过Boost解决的需求,它就有许多库非常有用。我们可以自己编写代码,也可以使用非常可靠的库。
搁置了诸如Multi-Index,Lambda,程序选项,RegEx,SmartPtr和Tuple之类的资源,这真是令人惊讶...

最好的办法是花一些时间浏览不同库的文档,并评估它是否对我们有用。

值得!

以上所有这些,再加上它鼓励了许多现代的,最佳实践的C ++技术。它倾向于提高代码的质量。

Boost很棒,但是仅仅在这里扮演Devil's Advocate就是一些我们可能不想使用Boost的原因:

  • 有时确实无法在旧的编译器上编译/正常工作。
  • 它通常比不使用大量模板的方法增加编译时间。
  • 某些Boost代码可能无法实现我们认为的功能。阅读文档!
  • 模板滥用会导致无法读取的错误消息。
  • 模板滥用会导致代码难以在调试器中逐步通过。
  • 这是C ++的前沿。下一版本的Boost可能不再在我们当前(较旧)的编译器上编译。

所有这一切并不意味着即使我们不按原样使用Boost,也不要看一下Boost代码并自己获得一些想法。

尤其是在多线程代码中,shared_ptrweak_ptr值得安装boost。 BOOST_STATIC_ASSERT在执行编译时逻辑检查方面也很酷。

另外,boost中的许多类和实用程序都位于标头中,这意味着我们无需编译任何内容即可获得很多功能,这也是一个优点。除非我们使用非常老的编译器,否则可移植性通常不是问题。我曾经试图使MPL与VC6配合使用,然后在完全爆炸之前打印出40,000个警告/内部错误。但是通常,无论平台或者编译器供应商如何,大多数库都可以工作。

考虑到这样一个事实,Boost中已经有很多东西已经存在于TR1中,并且很可能会在C ++标准库的下一个修订版中出现。这是一个很大的认可。

还请注意,大多数提升都是模板,因此不需要构建
(只包括正确的头文件)。

需要构建的几个部分是可选的:
它们每个都可以独立构建,从而避免了不必要的代码不必要的膨胀。