f99aq8ove's blog

C++ で Option 型 - boost::optional

tag: C++ and boost
19 October 2015

このエントリは 2015-10-19 に書かれました。 内容が古くなっていたり、もはや正しくないこともありますので、十分検証を行ってください。

option type

option type というものがあります。 https://en.wikipedia.org/wiki/Option_type 雑に言うと、特定の型の値か、値がないという状態を持てる型です。

Haskell の Maybe, Scala の Option, Swift の Optional, Java にも Optional があったりしますね。 (言語によって機能が微妙に違ったりする気がしますが、ここでは触れないことにします。)

こういった仕組みがない場合、例えば int 型の変数で無効値を表現するために -1 に特殊な意味を持たせるということをしたりしますが、-1 を後々有効値として使用したくなって詰むとか、無効値を間違えてしまって事故るとかそういう残念なことが起きがちです。

ということで option type を C++ でも使えるみたいなので試してみました。

boost::optional

boost に boost::optional があるのでこれを使ってみます。 (手元には 1.55 しかなかったのでこれを使いました。 http://www.boost.org/doc/libs/1_55_0/libs/optional/doc/html/index.html )

使い方

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

using namespace std;

boost::optional<string> getFuga() {
    return boost::optional<string>("fuga");
}

int main(int, char **) {
    boost::optional<int> hoge(1); // 1 で作成
    if (hoge) { // 有効かどうかを判定
        // ポインタのように値を取得可能
        cout << *hoge << endl;      // -> 1
        // 値取得用メンバ関数もある
        cout << hoge.get() << endl; // -> 1
    }

    if (auto fuga = getFuga()) {  // if で option 型の変数を定義しつつ有効かどうか判定できるので、比較的簡潔に記述できる
        cout << *fuga << endl;      // -> fuga
    }

    boost::optional<long> foo;  // 無効な optional
    // 無効値だった場合の値を与えることで簡潔に記述できる
    cout << foo.get_value_or(1000) << endl;  // -> 1000

    if (!foo) {
        // 無効だった場合の判定も可能
        cout << "foo is empty!" << endl;  // -> foo is empty!
    }

    return 0;
}

Related Posts