自从我开始使用这个站点以来,我不断听到关于 Boost 库的消息。我想知道 Boost 库的一些主要好处是什么(因此我为什么要使用它)以及 Boost 库的可移植性如何?
12 回答
Boost 由标准委员会的几位成员组织。
因此,它是下一个标准中图书馆的温床。
- 它是 STL 的扩展(它填补了遗漏的位)
- 这是有据可查的。
- 它得到了同行评议。
- 它具有很高的活动性,因此可以快速找到并修复错误。
- 它是平台中立的,适用于任何地方。
- 它可以免费使用。
随着 tr1 即将推出,很高兴知道 boost 已经覆盖了很多领域。tr1 中的很多库基本上都是直接从 boost 原件改编而来的,因此已经过尝试和测试。不同之处在于它们已被移至 std::tr1 命名空间(而不是 boost)。
您需要做的就是将以下内容添加到您的编译器默认包含搜索路径中:
<boost-install-path>/boost/tr1/tr1
然后,当您包含标准标头时,boost 将自动将所有必需的东西导入命名空间 std::tr1
例如:
要使用 std::tr1::share_ptr 你只需要包含 <memory>。这将为您提供一个文件的所有智能指针。
您可以简单地阅读Boost 背景信息页面,快速了解为什么应该使用 Boost 以及可以将其用于什么用途。值得花几分钟。
99% 便携。
我想说的是,一旦你发现了通过 boost 解决的需求,它就有很多真正有用的库。您可以自己编写代码,也可以使用非常可靠的库。拥有像 Multi-Index、Lambda、Program Options、RegEx、SmartPtr 和 Tuple 这样的现成资源真是太棒了……
最好的办法是花一些时间浏览不同库的文档并评估它是否对您有用。
值得!!
Boost 很棒,但只是在这里玩 Devil's Advocate 是您可能不想使用 Boost 的一些原因:
- 有时无法在旧编译器上编译/正常工作。
- 它通常比使用较少模板的方法增加编译时间更多。
- 某些 Boost 代码可能不会像您认为的那样做。阅读文档!
- 模板滥用可能导致无法阅读的错误消息。
- 模板滥用会导致代码难以在调试器中单步执行。
- 它是最前沿的 C++。下一个版本的 Boost 可能不再在您当前(旧)的编译器上编译。
所有这一切并不意味着即使您不按原样使用 Boost,您也不应该查看 Boost 代码并自己获得一些想法。
你会得到很多 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++ 库的集合。其中 10 个包含在 C++0x 的 tr1 中。
您可以在此处开始使用 boost。
Boost是一组高质量的同行评审 C++ 库,它们强调可移植性和正确性。它是语言和标准库新增功能的事实上的试验场。查看他们的网站了解更多详情。
Boost 的优点:它广泛可用,可以移植到任何现代 C++ 编译器或任何平台。
这些功能与平台无关,您不必为每个新框架学习新的线程设计。
它以标准方式封装了许多特定于平台的功能,例如文件系统。
这是 C++ 应该附带的!Java 的很多流行之处在于它附带了一个标准库,可以做几乎所有你想做的事情。不幸的是,C++ 只继承了有限的 C/Unix 标准函数。
shared_ptr
和weak_ptr
,尤其是在多线程代码中,单独值得安装 boost。 BOOST_STATIC_ASSERT
做编译时逻辑检查也很酷。
boost 中的许多类和实用程序都在标头中,这意味着您无需编译任何东西就可以获得很多功能,这也是一个优点。可移植性通常不是问题,除非您使用非常旧的编译器。我曾经试图让 MPL 与 VC6 一起工作,它在完全爆炸之前打印出 40,000 个警告/内部错误。但总的来说,无论您的平台或编译器供应商如何,大多数库都应该可以工作。
考虑到 Boost 中的很多东西已经在 TR1 中,并且很可能会出现在 C++ 标准库的下一个版本中。这是一个相当大的认可。
Boost 是一个非常广泛的(通常)通用结构库,可以帮助几乎任何应用程序。这可以从 C++ 0x 规范中包含许多 boost 组件这一事实来证明。
它也至少可以在主要平台上移植,并且应该可以移植到几乎任何具有大多数标准兼容的 C++ 编译器的东西。
唯一的警告是 boost 库之间可能有很多混合的依赖关系,这使得只选择一个特定的组件来分发(而不是整个 boost 库)变得更加困难。
以上所有,加上它鼓励了许多现代的、最佳实践的 C++ 技术。它倾向于提高代码的质量。
另请注意,大多数 boost 是模板,因此不需要构建
(只需包含正确的头文件)。
The few parts that do require building are optional:
These can each be built independently thus preventing unnecessary bloat for unneeded code.