问题标签 [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.
c++ - Boost 可选隐式转换为 bool?
我正在阅读一些代码,但遇到了一些我不理解的东西。它是关于测试 Boost::optional 值是否已初始化。它使用提供ASSERT_TRUE()
宏的 gtest 框架。
为什么我需要!!
before opt
?a 是否boost::optional
未隐式转换为宏所需的布尔值?ASSERT_TRUE(opt)
我认为使用它来检查 opt 是否具有正确的值就足够了?
c++ - 为什么当我可以返回指针时使用 boost::optional
如果我有一个find
有时无法找到所需事物的函数,我倾向于使该函数返回一个指针,以便 anullptr
指示未找到该事物。
例如
如果 Student 存在,它会返回一个指向找到的Student
对象的指针,否则它会返回nullptr
。
我也看到boost::optional
有人为此目的而提倡。例如,当您想要实现一个可以返回“无”的函数时,何时使用 boost::optional 以及何时使用 std::unique_ptr?
我的问题是,在这种情况下,返回指针不是最好的解决方案。ie 有可能找不到查询的项目,在这种情况下返回nullptr是一个完美的解决方案。使用类似的东西boost::optional
(或任何其他类似的解决方案)有什么好处?
请注意,在我的示例中,findStudent
只会返回指向 . 拥有的对象的指针SomeClass
。
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*
),那么使用类似的东西自动选择它们是否有意义
(注意:有一个问题讨论了这两者作为返回类型之间的权衡,但问题和答案集中在每个传递给函数调用者的内容上,这与这些私有成员无关。)
python - 使用 boost::python 包装 boost::optional
有没有办法包装boost::optional<T>
类型对象以通过boost::python::class_
(使用 from BOOST_PYTHON_MODULE
)公开它
在这种情况下,我对 Python 的期望是 AttributeError
因为 的值bar
尚未设置。而TypeError
当
bar
是int
类型。
另一个相关的问题是以同样的方式导出boost::python::indexing_suite
容器类型的类对象。
boost::python
使用api可以解决问题吗?
c++ - 具有多种表示的项目的 C++ 设计模式
我有一个“项目”,其数据可以用 3 种方式表示。我可以以运行时成本从一种表示转换为任何其他表示。完成转换后,我想保留新的表示形式。数据的任何表示都可以转换为其他任何表示,而无需“修改”核心数据。由于运行时成本,我想要一个包含 3 种数据表示的类。在任何时候,其中的 1 到 3 个都是有效的。
这样做的真正意义在于它还具有访问方法,用户可以在其中请求某些东西。这可以从 1 个或更多的表示中得到。例如,您可以从表示 1 中获取“范围”,从表示 2 或 3 中获取“体积”。
我的解决方案是创建具有 3 种表示形式的类作为成员数据(以及一种知道它们是否有效的方法)。然后我创建了一个 getRange() 方法,该方法在内部知道它需要哪种表示并在必要时创建它。除了 get 方法不能是 const 之外,这可以正常工作并解决我的所有问题。
所以这个解决方案的真正问题是,即使是这个类的“常量”实例也不是真正的 const,因为它在内部可能会创建其他表示。但是它确实是“恒定的”,因为更改表示不会修改核心数据。
是否有可能对此类有所帮助的 C++ 设计模式?有什么建议么?
c++ - boost optional 承认继承?
func 会接受两个选项:基础和派生吗?
c++ - 基于范围的 for 循环表达式中的临时可选
假设我们有一个返回的函数std::optional<A>
。那么在基于范围的 for 循环中使用结果的正确方法是什么?最简单的方法不起作用:
如果我们有T optional::value() &&
而不是,这个问题就不会存在T&& optional::value() &&
,但是 STL 和 Boost 都以第二种方式定义它。
处理这种情况的正确方法是什么?我不喜欢我能想到的两种解决方案(沙箱):
c++ - 需要澄清 boost::optional 类型
我试图从核心文件中获得的关于 boost::optional 类型变量的一些细节中理解。
多变的:
来自核心的第 5 帧:
在这一帧中执行的行是:
结果,导致崩溃的几帧指向提升库代码:
第0帧是调用析构函数的地方Cacher
,崩溃是因为对象持有的内存已经被释放。
我的问题:
- 是否
boost::optional
表明所持有的内存cacher_
有效? - 作为分配
boost::none
to的结果cacher_
,对象会被销毁吗?
如果诊断问题的详细信息不足,请致歉。我将尝试根据回复提供更多详细信息。
谢谢!
c++ - 使用 boost::optional 捕获和包装异常
我想捕获由库代码生成的异常并将它们包装在boost::optional
s (或std::experimental::optional
)中。我的代码适用于琐碎的情况,但在调用重载函数时很难推断出正确的类型。我已将我的测试用例简化为:
尝试编译“损坏”示例时,我得到以下输出:
我可以通过创建具有正确类型的函数指针来回避这个问题,但这并不理想。有没有解决我的问题的方法,还是我被丑陋的函数指针黑客所困扰?
干杯,瑞恩
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 3
和boost 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
: