#include <iostream>
#include <boost/optional.hpp>
using namespace std;
using namespace boost;
// √x を越えない最大の整数を返す関数
// ただし、xが負の数の時は、「不正です」という値を返す
optional<int> sqrt( int x )
{
if( x < 0 )
return optional<int>();
int i;
for(i=0; i*i<=x; ++i) {}
return optional<int>(i-1);
}
int main()
{
for(int j=-5; j<=5; ++j)
{
optional<int> x = sqrt(j);
if( x ) // 正しいint値を保持しているかどうかチェック
cout << *x << endl; // 正しければdereference
else
cout << "invalid" << endl;
}
return 0;
}
invalid invalid invalid invalid invalid 0 1 1 1 2 2
従来これと同じ働きをC++で実現するには、ポインタが使われていました。 ポインタは何かオブジェクトを指しているかもしれないし、 あるいは何も指していない、nullポインタかもしれない。 で、そういう値を扱うときには、次のようなコードを書いたと思います。 これと同じ事を実現するのがoptional<>なわけですね。
void func( int p, struct hogehoge* ptr ) {
if( ptr )
*ptr = do_something( p );
else
do_something( p );
}
というわけで、このoptionalクラステンプレートは基本的に、 ポインタとよく似たインターフェイスで扱えるようになっています。
ポインタではなくoptionalを利用する利点は、上のように 「ローカル変数を返値として返すような場合にも簡単に使える」点、 「optionalな変数であることを(ポインタを使うよりも)明らかに表現できる」点、 などがあります。
具体的な使用場面としては、 ドキュメント の最初に挙げられている3つがわかりやすいかと。