问题标签 [boost]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
25 回答
19843 浏览

c++ - Boost最常用的部分

当我发现时,boost::lexical_cast我心想“为什么我不早点知道这件事!” - 我讨厌不得不编写类似的代码

现在我写

昨天,在 stackoverflow 上,我遇到了 boost split(另一个可以帮助我编写代码的 gem)。

我将开始查看 boost 文档,寻找我可以经常使用的其他功能,但我觉得很容易错过一些东西。

您最常使用/不想拥有哪些增强功能?

0 投票
17 回答
52553 浏览

c++ - C++ - 传递对 std::shared_ptr 或 boost::shared_ptr 的引用

如果我有一个需要使用 a 的函数,shared_ptr将它的引用传递给它会不会更有效(以避免复制shared_ptr对象)?可能的不良副作用是什么?我设想了两种可能的情况:

1) 在函数内部,由参数制作副本,如

2)在函数内部只使用参数,如

在这两种情况下,我都看不到传递boost::shared_ptr<foo>值而不是引用的充分理由。按值传递只会“暂时”增加由于复制而导致的引用计数,然后在退出函数范围时减少它。我忽略了什么吗?

只是为了澄清一下,在阅读了几个答案之后:我完全同意过早优化问题,并且我总是尝试首先分析热点然后工作。如果您知道我的意思,我的问题更多是从纯技术代码的角度来看的。

0 投票
2 回答
2534 浏览

c++ - 将宽字符串转换为提升日期

我需要将存储为宽字符串的数百万个日期转换为提升日期

以下代码有效。但是,它会生成一个可怕的编译器警告,并且似乎效率不高。

有没有更好的办法?


更好的方法是使用标准 C++ 库locale,它是facets的集合。facet 是一项服务,它允许流操作员处理日期或时间表示或其他任何内容的特定选择。所有关于不同事物的选择,每一个都由它自己的方面处理,都聚集在一个语言环境中。

这个解决方案是由litb向我指出的, 他给了我足够的帮助来在我的生产代码中使用构面,使其更简洁、更快。谢谢。

Nathan Myers有一个关于语言环境和方面的优秀教程,他设计了方面。他有一种轻松的风格,使他的教程易于阅读,尽管这是高级的东西,第一次通读后你的大脑可能会受伤——我的就是这样。我建议你现在去那里。对于任何只想将宽字符串转换为提升日期的实用性的人,本文的其余部分描述了使其工作所需的最低限度。


litb 首先提供了以下消除编译器警告的简单解决方案。(解决方案在我开始接受之前已被编辑。)这看起来像它做同样的事情,一个一个地转换宽字符,但它避免了使用临时字符串,因此更清晰,我认为。我真的很喜欢编译器警告消失了。


litb 继续建议使用我以前从未听说过的“方面”。他们似乎完成了这项工作,在循环中生成了非常简洁的代码,但代价是设置语言环境的序言。

事实证明,这也更有效:

产生以下输出:

好的,这现在在生产代码中并通过了回归测试。它看起来像这样:

我对此有最后一个问题。将方面添加到语言环境似乎需要两次调用语言环境复制构造函数

为什么没有 add(facet*) 方法?( _Addfac() 很复杂,未记录且已弃用)

0 投票
10 回答
4059 浏览

c++ - 在库的公共接口中使用 boost::shared_ptr

我们有一个 C++ 库,我们提供给几个不同的客户。最近,我们从在公共接口中使用原始指针切换到使用 boost::sharedptr。正如您可能猜到的那样,这提供了巨大的好处,因为现在客户不再需要担心谁需要删除什么以及何时删除。当我们进行转换时,我认为这是正确的做法,但让我感到困扰的是,我们必须在我们的公共界面中包含来自第三方库的东西——通常,如果可以的话,你会避免这种事情。我合理化了 boost 现在实际上是 C++ 语言的一部分,我们的用例要求客户端代码和库都保存指向对象的指针。然而最近我们的一位客户问我们是否可以切换到在界面中使用中性智能指针类,因为我们的库本质上是在强迫他们使用特定版本的 boost——我当然理解和欣赏这一点。所以现在我想知道最好的行动方案是什么。我已经考虑了一点,并想知道创建一个简单的智能指针类,它只包含一个真正的 boost 智能指针。但是随后客户可能会立即将其中一个塞入他们的 boost::sharedptr 风格中,然后我们将深入三个共享指针——这可能是一个问题,也可能不是。无论如何,我很想听听社区关于解决这个问题的最佳方法的一些意见。我已经考虑了一点,并想知道创建一个简单的智能指针类,它只包含一个真正的 boost 智能指针。但是随后客户可能会立即将其中一个塞入他们的 boost::sharedptr 风格中,然后我们将深入三个共享指针——这可能是一个问题,也可能不是。无论如何,我很想听听社区关于解决这个问题的最佳方法的一些意见。我已经考虑了一点,并想知道创建一个简单的智能指针类,它只包含一个真正的 boost 智能指针。但是随后客户可能会立即将其中一个塞入他们的 boost::sharedptr 风格中,然后我们将深入三个共享指针——这可能是一个问题,也可能不是。无论如何,我很想听听社区关于解决这个问题的最佳方法的一些意见。

编辑:我最初说的是所有权转移,但我应该指定API边界两边的代码都需要持有一个指向对象的指针。

0 投票
3 回答
4883 浏览

c++ - 矩阵模板库矩阵求逆

我正在尝试使用 Boost boost_1_37_0 和 MTL mtl4-alpha-1-r6418 版本对矩阵求逆。我似乎无法找到矩阵求逆代码。我搜索了一些示例,它们似乎引用了上述版本中似乎缺少的 lu.h。有什么提示吗?

@Matt建议复制 lu.h,但这似乎来自 MTL2 而不是 MTL4。我在用 VS05 或更高版本编译 MTL2 时遇到问题。

那么,知道如何在 MTL4 中进行矩阵求逆吗?

更新:我想我更了解马特,我正在沿着这条 ITL 路径前进

0 投票
6 回答
2460 浏览

c++ - shared_ptr:它是做什么用的

我在我的代码中大量使用了 boost::scoped_ptr,它很棒,但我目前正在使用到处使用 shared_ptr 的软件,我想知道我是否遗漏了一些东西。

AFAIK shared_ptr 仅在不同的线程要访问相同的数据并且您不知道线程将要完成的顺序时才有用(shared_ptr 确保对象存在直到最后一个线程完成它)。

还有其他用例吗?

0 投票
1 回答
320 浏览

c++ - 是否有一种“好”的方法来处理来自多个来源的重新组装多播?

我目前正在修改我们现有的专有套接字包装器代码以使用 boost asio,以便它可以为我们完成一些繁重的工作。也许我们现有代码中最复杂的部分是多播处理代码。该代码允许我们的中间层服务器(在一个系统中可以有多个)向客户端发送多播,客户端使用这些向系统用户提供更新。

代码复杂且容易出错的原因是它使用许多原始缓冲区来根据多播流的来源重新组装多播流。似乎即使使用 Boost.Asio 我也将不得不处理同样的问题,所以在我陷入困境之前,我认为值得问问其他人是如何处理这种情况的。

这似乎是一个非常常见的用例。没有我现在拥有的那种代码,有什么东西可以帮助我完成这项工作吗?或者是否有一个既定的 C++ 模板(Boost 或其他)可以做这种工作?

显然,我可以让事情变得更轻松,并使用 STL 容器来缓冲数据包而不是原始数组,但是这段代码需要非常高性能。在大型安装中,有大量的数据包飞来飞去,它需要尽可能接近实时地响应。

提前感谢您对此事的任何想法。

杰米

0 投票
10 回答
1387 浏览

c++ - C++ 中的多个整数类型类

我经常发现自己使用整数来表示不同“空间”中的值。例如...

理想情况下,我想为这些类型“索引”、“年”和“天”中的每一个设置单独的类,这样可以防止我不小心把它们混在一起。从文档的角度来看,Typedef 是一种帮助,但不够类型安全。

我已经尝试过包装类,但最终我喜欢的样板太多。是否有一个简单的基于模板的解决方案,或者在 Boost 中是否有现成的解决方案?

编辑:有几个人在他们的答案中谈到了边界检查。这可能是一个方便的副作用,但不是关键要求。特别是,我不仅想防止超出范围的分配,还想防止“不适当”类型之间的分配。

0 投票
3 回答
1440 浏览

c++ - 如何检测 Asio 库的死锁?

我对 boost::asio 库没什么问题。我的应用程序异步接收和处理数据,它创建线程并在每个线程上运行 io_service.run()。

一次又一次,我的应用程序从某个主管应用程序接收消息(通过 Windows 消息传递系统),该应用程序检查我的程序是否处于活动状态。如果我的应用程序没有回复,它将重新启动。这里棘手的部分是检查线程是否正在运行并且没有死锁。我可以像这样将处理程序发布到 io_service:

但这种方法只影响一个线程。如何检查所有线程是否正在运行并且没有死锁?

0 投票
6 回答
12047 浏览

c++ - 如何从 boost::ptr_vector 中删除元素

所以我试图通过使用 boost::ptr_vector 来摆脱我的 std::vector 。现在我正在尝试从一个元素中删除一个元素,并将删除的元素也删除。对我来说最明显的事情是:

但这甚至不会编译(完整的错误信息见下文)。我已经像在 std::vector 上一样尝试了擦除/删除习语,但 boost::ptr_vector 的所有算法都与 std::vector 中的算法略有不同。

所以我的问题:

  • 如何从 ptr_vector 中删除指针?
  • 我还需要手动删除()我删除的那个元素吗?

编译器错误: