问题标签 [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++ - 如何实现 std::optional 的复制构造函数?
我正在实施std::optional
,但遇到了其中一个复制构造函数的障碍。
这是我的实现的草图:
optional
问题是编译器抱怨constexpr
构造函数没有空体:
我不确定如何初始化optional::m_data
,而且我无法在网络上找到参考实现(boost::optional
显然不使用constexpr
)。
有什么建议么?
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 有人知道解决方法吗?
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
。但不确定这是否有效?
c++ - 为什么不使用 boost::optional 作为更好的 scoped_ptr
为什么将 boost::optional 用作 scoped_ptr 并不常见,因为对象是在堆栈而不是堆上创建的,所以似乎更好。但我从未见过它以这种方式使用。我的问题是,除了明显无法进行多态性之外,使用 boost::optional 作为一种 scoped_ptr 的缺点是什么?
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
- 否则我希望它是正常的双除法。我应该自己写这个吗?
c++ - 模板模板参数与函数模板的等效行为
我正在尝试编写这样的代码:
希望能够在(std::[unordered_][multi]map)
具有字典接口的各种容器上调用上述函数,例如:
我知道函数模板不允许模板模板参数。但是还有其他方法可以达到同样的效果吗?
c++ - 引用类型的 std::optional 特化
为什么std::optional
(目前std::experimental::optional
在libc++中)没有针对引用类型的专门化(与 相比boost::optional
)?
我认为这将是非常有用的选择。
是否有一些对象引用了STL中可能已经存在的对象语义?
c++ - 如何脱离 std::experimental::optional?
使用 Boost,我可以创建一个可选的原位:
并通过以下方式解除它:
借助 C++14 / 实验性支持,我可以改为构建一个可选的原位:
但是我不知道如何脱离它......
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
版本begin
并end
为指针工作,但我做不到。所以我决定明确类型并删除所有模板:
快到了,它适用于
但它不适用于所谓的等效for-range 循环:
两个编译器告诉我:error: invalid range expression of type 'double *'; no viable 'begin' function available
到底是怎么回事?是否有一种编译器魔法禁止范围循环为指针工作。我是否对范围循环语法做出了错误的假设?
具有讽刺意味的是,在标准中有一个过载std::begin(T(&arr)[N])
,这非常接近它。
注意和第二个
是的,这个想法很愚蠢,因为即使可能,这也会很混乱:
只会遍历第一个元素。一个更清晰、更现实的解决方法是做类似@Yakk 提出的解决方法:
通过这种方式,很明显我们只迭代一个元素并且该元素是可选的。
好的,好的,我会回去的if(ptr) ... use *ptr
。
c++ - boost::optional 和类型转换
我想知道是否有一种优雅的方法可以将 aboost::optional<A>
转换为boost::optional<B>
whenB
可以从 构造A
,尽管是明确的。这有效:
但是需要在其中放入一些永远不会使用的值似乎很尴尬。有更好的建议吗?