问题标签 [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 回答
760 浏览

c++ - 如何实现 std::optional 的复制构造函数?

我正在实施std::optional,但遇到了其中一个复制构造函数的障碍。

这是我的实现的草图:

optional问题是编译器抱怨constexpr构造函数没有空体:

我不确定如何初始化optional::m_data,而且我无法在网络上找到参考实现(boost::optional显然不使用constexpr)。

有什么建议么?

0 投票
4 回答
11984 浏览

c++ - 如何绕过 GCC '*((void*)& b +4)' 可能在使用 boost::optional 时在此函数警告中未初始化使用

我有类似于以下的代码:

使用 Boost 1.53 编译 GCC 4.7.2 时,使用以下命令:

g++ -c -O2 -Wall -DNDEBUG

发出以下警告:

13:3:警告:'<em>((void)& b +4)' 可能在此函数中未初始化 [-Wmaybe-uninitialized]

显然,根本问题在于 GCC。请参阅GCC Bugzilla 有人知道解决方法吗?

0 投票
4 回答
108126 浏览

c++ - 如何使用 boost::optional

我正在尝试boost::optional如下使用。

我收到以下错误

prog.exe: /usr/local/boost-1.55.0/include/boost/optional/optional.hpp:631: boost::optional::reference_type boost::optional::get() [with T = myClass; boost::optional::reference_type = myClass&]: 断言 `this->is_initialized()' 失败。

据推测,可选变量未正确初始化。如何以正确的方式做到这一点?

编辑:: 得到了一些非常好的答案,还有几个问题 1.在函数make_optional末尾使用'func'并返回它是一个好主意吗?另外 2. 我正在考虑分配boost::none以强调我没有分配价值,这就是为什么boost::none。但不确定这是否有效?

0 投票
2 回答
385 浏览

c++ - 为什么不使用 boost::optional 作为更好的 scoped_ptr

为什么将 boost::optional 用作 scoped_ptr 并不常见,因为对象是在堆栈而不是堆上创建的,所以似乎更好。但我从未见过它以这种方式使用。我的问题是,除了明显无法进行多态性之外,使用 boost::optional 作为一种 scoped_ptr 的缺点是什么?

0 投票
1 回答
708 浏览

c++ - 如何划分 boost::optional?

我有这样的代码:

每个 argboost::optional<double>也是:

错误是:

Error 1 error C2676: binary '/' : 'boost::optional<T>' does not define this operator or a conversion to a type acceptable to the predefined operator 2 IntelliSense: no operator "/" matches these operands operand types are: boost::optional<double> / boost::optional<double>

我知道似乎只是没有定义部门。我希望结果是boost::none如果两个参数中的任何一个是none- 否则我希望它是正常的双除法。我应该自己写这个吗?

0 投票
2 回答
106 浏览

c++ - 模板模板参数与函数模板的等效行为

我正在尝试编写这样的代码:

希望能够在(std::[unordered_][multi]map)具有字典接口的各种容器上调用上述函数,例如:

我知道函数模板不允许模板模板参数。但是还有其他方法可以达到同样的效果吗?

0 投票
6 回答
19725 浏览

c++ - 引用类型的 std::optional 特化

为什么std::optional(目前std::experimental::optionallibc++中)没有针对引用类型的专门化(与 相比boost::optional)?

我认为这将是非常有用的选择。

是否有一些对象引用了STL中可能已经存在的对象语义?

0 投票
3 回答
2770 浏览

c++ - 如何脱离 std::experimental::optional?

使用 Boost,我可以创建一个可选的原位:

并通过以下方式解除它:

借助 C++14 / 实验性支持,我可以改为构建一个可选的原位:

但是我不知道如何脱离它......

0 投票
3 回答
2132 浏览

c++ - 在基于范围的 for 循环中将原始指针视为范围

对于 for-range 循环语法,如何使原始指针表现得像一个范围。

动机:

现在可以将boost::optional(未来std::optional)值视为一个范围,因此可以将其用于范围循环http://faithandbrave.hateblo.jp/entry/2015/01/29/173613

当我重写我自己的简化版本时:

用作

在查看该代码时,我想它也可以推广到原始(可为空)指针。

而不是通常的if(dptr) std::cout << *dptr << std::endl;. 这很好,但我想实现上面的其他语法。

尝试

首先,我尝试制作上述Optional版本beginend为指针工作,但我做不到。所以我决定明确类型并删除所有模板:

快到了,它适用于

但它不适用于所谓的等效for-range 循环:

两个编译器告诉我:error: invalid range expression of type 'double *'; no viable 'begin' function available

到底是怎么回事?是否有一种编译器魔法禁止范围循环为指针工作。我是否对范围循环语法做出了错误的假设?

具有讽刺意味的是,在标准中有一个过载std::begin(T(&arr)[N]),这非常接近它。


注意和第二个

是的,这个想法很愚蠢,因为即使可能,这也会很混乱:

只会遍历第一个元素。一个更清晰、更现实的解决方法是做类似@Yakk 提出的解决方法:

通过这种方式,很明显我们只迭代一个元素并且该元素是可选的。

好的,好的,我会回去的if(ptr) ... use *ptr

0 投票
1 回答
2944 浏览

c++ - boost::optional 和类型转换

我想知道是否有一种优雅的方法可以将 aboost::optional<A>转换为boost::optional<B>whenB可以从 构造A,尽管是明确的。这有效:

但是需要在其中放入一些永远不会使用的值似乎很尴尬。有更好的建议吗?