boost 的 optional

说起来这个东西真有点“蛋疼”的意味,就是函数返回值很多时候我们希望有,也可能希望没有。比如搜索字符串,没找到不能返回没有,只能返回 -1,parse 用户输入的参数,某些可省的参数对应的结果也是可以没有的。为了获得一个 generic 的 solution,请使用 boost.optional。

#include <boost/optional.hpp>
#include <iostream>

boost::optional<int>
find (const std::string& s, char t) {
  for (int i = 0 ; i < s.length () ; ++ i)
    if (s [i] == t)
      return i ;
  return boost::optional<int>() ;
}

int
main (int argc, char* argv[]) {
  std::string s = argv[1] ;
  char t = *argv[2] ;
  boost::optional<int> idx = find (s, t) ;
  if (idx)
    std::cout << "found at " << *idx << std::endl ;
  else
    std::cout << "not found" << std::endl ;

  return 0 ;
}

本质上 optional 只是额外维护了一个 bool 标志是否初始化了对应管理的对象的区域,因此 optional 包裹之后占用的空间会变大。hmmm… 所以很蛋疼,不就是个类似 boost::tuple<T, bool> 的玩意么… 当然通过 reset 这个还能替换掉里面存放的对象。

——————
And I will establish my covenant between me and you and your seed after you in their generations for an everlasting covenant, to be a God to you, and to your seed after you.

Advertisements
boost 的 optional

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s