Home > 6月 23rd, 2009

2009.06.23

gccにおけるstd::tr1::regex

とあるプログラムで,C++からregexを使いたい状況が発生.boostにあるのは知っているけど,出来るだけboostを使わないコーディングをしているので,あれこれ調査していたら,tr1に盛り込まれる予定だったことを思い出す.

Visual Studio 2008 SP1では,tr1のサポートが追加され,すんなりregexが使えるようになっている.コードはこんな感じ.すごく便利.

#include < iostream>
#include < regex>

int main(int argc, char *argv[])
{
    std::tr1::regex rx("abc");
    std::cout
        << "search(\"abcabc\", \"abc\") == "
        << std::boolalpha << regex_search(std::string("abcabc"), rx)
        << std::endl;
    return 0;
}

g++ではtr1のヘッダファイルはtr1というディレクトリに入っているので,<tr1/regex>をインクルードするようにプログラムを変更したら,コンパイルは通るものの,結果がおかしい.上のサンプルコードを動かしたみたら,見事にfalseを返してくれる.

libstdc++のドキュメントを調べて見たら,現状ではtr1のregexはlibstdc++でサポートされていないらしい.この地雷を踏んで余計な時間を使ってしまった.当面はboostと両刀使いで行くしか無いかないが,下手にコンパイルが通るだけに,configureで判別するのが面倒くさい.