【问题标题】:boost::optional and type conversionboost::optional 和类型转换
【发布时间】:2015-02-05 15:03:45
【问题描述】:

我想知道当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;
}

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

【问题讨论】:

    标签: c++ boost boost-optional


    【解决方案1】:
    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;
    }
    

    可以代替,但在许多情况下效率较低。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多