微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当 std::optional 和 boost::optional 的值是一个变体时,它的区别

如何解决当 std::optional 和 boost::optional 的值是一个变体时,它的区别

在嵌入式编程中,内存分配是我们想要避免的。所以使用像状态设计模式这样的设计模式是很麻烦的。如果我们知道我们将拥有多少个状态,那么我们可以使用放置新操作。但是在这article 中,函数方法避免了所有内存操作。唯一的缺点是它仅适用于具有 C++17 可用性的用户。我尝试在 c++11 中使用 boost::variant 和 boost::optional,但是在这个最小的 example 中缺少一个转换运算符(这里使用带有 c++17 的 MSVC 它编译但不使用 std最新):

#include <string>
#include <boost/variant.hpp>
#include <boost/optional.hpp>


boost::optional<boost::variant<int,std::string>> f()
{
   return 5;
}


int main()
{
    auto ret = *f();
    return *boost::get<int>(&ret);
}

错误信息:

error: no viable conversion from returned value of type 'int' to function return type 'boost::optional<boost::variant<int,std::string>>' (aka 'optional<variant<int,basic_string<char>>>')
return 5;

但是如果我用 std::optional 替换 boost::optional ,它编译得很好:compiling example 有人能解释一下它们之间有什么区别吗,我怎样才能让它与 boost 一起工作?

解决方法

boost::optional 没有接受参数传递给底层类型的构造函数,但 std::optional 有(参见构造函数编号 8)

您需要显式调用可选构造函数:

boost::optional<boost::variant<int,std::string>> f()
{
    return boost::optional<boost::variant<int,std::string>>{5};
}

或者由于包含的值类型的构造是非显式的:

boost::optional<boost::variant<int,std::string>> f()
{
    return boost::variant<int,std::string>{5};
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。