boost ::可选和类型转换

时间:2015-02-05 15:03:46

标签: c++ boost boost-optional

我想知道是否有一种优雅的方法可以boost::optional<A>boost::optional<B>转换为BA可以从# 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; } 构建,尽管是明确的。这有效:

{{1}}

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

1 个答案:

答案 0 :(得分:8)

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;
}

会起作用,但在许多情况下效率会降低。