boost::optional 和类型转换
boost::optional and type conversion
我想知道当 B
可以从 A
构造时,是否有一种优雅的方法将 boost::optional<A>
转换为 boost::optional<B>
,尽管是明确的。这有效:
# 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;
}
将改为工作,但在许多情况下效率较低。
我想知道当 B
可以从 A
构造时,是否有一种优雅的方法将 boost::optional<A>
转换为 boost::optional<B>
,尽管是明确的。这有效:
# 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;
}
将改为工作,但在许多情况下效率较低。