gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:14:38 26 4
gpt4 key购买 nike

我想知道是否有一种优雅的方式来转换 boost::optional<A>boost::optional<B>什么时候B可以从 A 构建,尽管是明确的。这有效:

# include <boost/optional.hpp>

class Foo
{
int i_;
public:
explicit Foo(int i) : i_(i) {}
};

int main()
{
boost::optional<int> i;
... // i gets initialized or not
boost::optional<Foo> foo;
foo = boost::optional<Foo>(bool(i), Foo(i.value_or(0 /*unused value*/)));
return 0;
}

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

最佳答案

template<class T, class U>
boost::optional<T> optional_cast( U&& u ) {
if (u) return T(*std::forward<U>(u));
else return {};
}

有趣的是也可以使用指针。

int main() {
boost::optional<int> i;
... // i gets initialized or not
boost::optional<Foo> foo = optional_cast<Foo>(i);
return 0;
}

在 C++03 中

template<class T, class U>
boost::optional<T> optional_cast( U const& u ) {
if (u) return T(*u);
else return boost::none;
}

将改为工作,但在许多情况下效率较低。

关于c++ - boost::optional 和类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28347288/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com