问题标签 [boost-optional]

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 投票
1 回答
1535 浏览

c++ - Boost 可选隐式转换为 bool?

我正在阅读一些代码,但遇到了一些我不理解的东西。它是关于测试 Boost::optional 值是否已初始化。它使用提供ASSERT_TRUE()宏的 gtest 框架。

为什么我需要!!before opt?a 是否boost::optional未隐式转换为宏所需的布尔值?ASSERT_TRUE(opt)我认为使用它来检查 opt 是否具有正确的值就足够了?

0 投票
4 回答
8016 浏览

c++ - 为什么当我可以返回指针时使用 boost::optional

如果我有一个find有时无法找到所需事物的函数,我倾向于使该函数返回一个指针,以便 anullptr指示未找到该事物。

例如

如果 Student 存在,它会返回一个指向找到的Student对象的指针,否则它会返回nullptr

我也看到boost::optional有人为此目的而提倡。例如,当您想要实现一个可以返回“无”的函数时,何时使用 boost::optional 以及何时使用 std::unique_ptr?

我的问题是,在这种情况下,返回指针不是最好的解决方案。ie 有可能找不到查询的项目,在这种情况下返回nullptr是一个完美的解决方案。使用类似的东西boost::optional(或任何其他类似的解决方案)有什么好处?

请注意,在我的示例中,findStudent只会返回指向 . 拥有的对象的指针SomeClass

0 投票
1 回答
302 浏览

c++11 - 间接成员 RAII:unique_ptr 还是可选的?

考虑一个类的成员不能直接存储,例如,因为它没有默认构造函数,并且封闭类的构造函数没有足够的信息来创建它:

显然,m_bar需要以不同方式存储,例如通过指针。不过, Astd::unique_ptr似乎更好,因为它会自动破坏它:

不过,也可以使用std::experimental::optional

我的问题是: 1. 权衡是什么?和 2. 构建一个自动选择它们的类是否有意义?

具体来说,查看ctor ofstd::unique_ptr异常保证和 ctor of 的异常保证,std::experimental::optional显然前者必须执行动态分配和释放 - 运行时速度劣势,后者将内容存储在一些(对齐的)内存缓冲区中 -尺寸缺点。这些是唯一的权衡吗?

如果这些确实是权衡,并且鉴于两种类型共享足够的接口(ctor,operator*),那么使用类似的东西自动选择它们是否有意义

(注意:有一个问题讨论了这两者作为返回类型之间的权衡,但问题和答案集中在每个传递给函数调用者的内容上,这与这些私有成员无关。)

0 投票
1 回答
1601 浏览

python - 使用 boost::python 包装 boost::optional

有没有办法包装boost::optional<T>类型对象以通过boost::python::class_(使用 from BOOST_PYTHON_MODULE)公开它

在这种情况下,我对 Python 的期望是 AttributeError

因为 的值bar尚未设置。而TypeError

barint类型。

另一个相关的问题是以同样的方式导出boost::python::indexing_suite容器类型的类对象。

boost::python使用api可以解决问题吗?

0 投票
2 回答
327 浏览

c++ - 具有多种表示的项目的 C++ 设计模式

我有一个“项目”,其数据可以用 3 种方式表示。我可以以运行时成本从一种表示转换为任何其他表示。完成转换后,我想保留新的表示形式。数据的任何表示都可以转换为其他任何表示,而无需“修改”核心数据。由于运行时成本,我想要一个包含 3 种数据表示的类。在任何时候,其中的 1 到 3 个都是有效的。

这样做的真正意义在于它还具有访问方法,用户可以在其中请求某些东西。这可以从 1 个或更多的表示中得到。例如,您可以从表示 1 中获取“范围”,从表示 2 或 3 中获取“体积”。

我的解决方案是创建具有 3 种表示形式的类作为成员数据(以及一种知道它们是否有效的方法)。然后我创建了一个 getRange() 方法,该方法在内部知道它需要哪种表示并在必要时创建它。除了 get 方法不能是 const 之外,这可以正常工作并解决我的所有问题。

所以这个解决方案的真正问题是,即使是这个类的“常量”实例也不是真正的 const,因为它在内部可能会创建其他表示。但是它确实是“恒定的”,因为更改表示不会修改核心数据。

是否有可能对此类有所帮助的 C++ 设计模式?有什么建议么?

0 投票
2 回答
745 浏览

c++ - boost optional 承认继承?

func 会接受两个选项:基础和派生吗?

0 投票
1 回答
211 浏览

c++ - 基于范围的 for 循环表达式中的临时可选

假设我们有一个返回的函数std::optional<A>。那么在基于范围的 for 循环中使用结果的正确方法是什么?最简单的方法不起作用:

如果我们有T optional::value() &&而不是,这个问题就不会存在T&& optional::value() &&,但是 STL 和 Boost 都以第二种方式定义它。

处理这种情况的正确方法是什么?我不喜欢我能想到的两种解决方案(沙箱):

0 投票
1 回答
772 浏览

c++ - 需要澄清 boost::optional 类型

我试图从核心文件中获得的关于 boost::optional 类型变量的一些细节中理解。

多变的:

来自核心的第 5 帧:

在这一帧中执行的行是:

结果,导致崩溃的几帧指向提升库代码:

第0帧是调用析构函数的地方Cacher,崩溃是因为对象持有的内存已经被释放。

我的问题:

  1. 是否boost::optional表明所持有的内存cacher_有效?
  2. 作为分配boost::noneto的结果cacher_,对象会被销毁吗?

如果诊断问题的详细信息不足,请致歉。我将尝试根据回复提供更多详细信息。

谢谢!

0 投票
1 回答
687 浏览

c++ - 使用 boost::optional 捕获和包装异常

我想捕获由库代码生成的异常并将它们包装在boost::optionals (或std::experimental::optional)中。我的代码适用于琐碎的情况,但在调用重载函数时很难推断出正确的类型。我已将我的测试用例简化为:

尝试编译“损坏”示例时,我得到以下输出:

我可以通过创建具有正确类型的函数指针来回避这个问题,但这并不理想。有没有解决我的问题的方法,还是我被丑陋的函数指针黑客所困扰?

干杯,瑞恩

0 投票
3 回答
2863 浏览

c++ - 包含 boost/optional.hpp 时出现 C2143 语法错误

我遇到了一个我无法理解的编译时错误。我尝试boost::optional在我的代码中使用,一旦包含,boost/optional.hpp我就无法再构建我的项目。如果我将此包含声明注释掉,它会起作用。我什至boost::optional在我的代码中还没有任何实际用法,只是类头中的 include 语句(参见下面的完整头)。编译器错误C2143 syntax error: missing ',' before '<'发生在另一个 Boost 标头中boost/utility/compare_pointees.hpp(请参阅下面的 GitHub 链接)。我也已经成功地在同一个项目中使用了来自 Boost 的其他东西boost::filesystem::path,所以我的 Boost 发行版应该没有问题。

这是我的环境:Microsoft Visual Studio Professional 2015 Version 14.0.25431.01 Update 3boost 1.62.0. 我也使用第三方库C++ REST SDK,其他都是 C++ 标准库的东西。

我的标题看起来像这样。我想添加一个boost::optional<size_t>作为返回类型的新方法。

编译器报错的地方在 Boost header第 36 行。你可以在 GitHub 上的https://github.com/boostorg/utility/blob/boost-1.62.0boost/utility/compare_pointees.hpp下查看该文件的完整内容/include/boost/utility/compare_pointees.hpp

编译器输出仅显示以下消息:

这肯定不是 Boost 库的问题。但是我如何才能弄清楚我的课程或项目设置有什么问题?

PS 即使我在项目中使用这些最原始的头文件和源文件,我也可以重现该行为:

头文件Test.h

源文件Test.cpp