boost::optional

トップページ > 拡張データ型 >

abstract

必要なヘッダ
<boost/optional.hpp>
出来ること
T型の値を表しているかもしれないし、いないかもしれない型optional<T>
リファレンス
en / jp

sample

#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

etc

従来これと同じ働きをC++で実現するには、ポインタが使われていました。 ポインタは何かオブジェクトを指しているかもしれないし、 あるいは何も指していない、nullポインタかもしれない。 で、そういう値を扱うときには、次のようなコードを書いたと思います。 これと同じ事を実現するのがoptional<>なわけですね。


void func( int p, struct hogehoge* ptr ) {
	if( ptr )
		*ptr = do_something( p );
	else
		do_something( p );
}

というわけで、このoptionalクラステンプレートは基本的に、 ポインタとよく似たインターフェイスで扱えるようになっています。

ポインタではなくoptionalを利用する利点は、上のように 「ローカル変数を返値として返すような場合にも簡単に使える」点、 「optionalな変数であることを(ポインタを使うよりも)明らかに表現できる」点、 などがあります。

具体的な使用場面としては、 ドキュメント の最初に挙げられている3つがわかりやすいかと。

presented by k.inaba (kiki .a.t. kmonos.net) under CC0