Boost 1.70.0がリリースされました

リリースノートは、いつものようにboostjpサイトで翻訳 + 情報補完したものを公開しています。

新ライブラリは、expectedのバリエーションを提供するOutcomeライブラリ、多次元ヒストグラムを扱うHistogramライブラリの2つです。

非推奨に近い状態だった線形代数ライブラリuBLASが、Google Summer of Codeでのコントリビュートを受けていろいろ機能追加されています。

リリースされたばかりのVisual Studio 2019はサポート対象外です。

C++20を相談しながら調べる会、を開催しました

C++20は3月の国際会議ですごく巨大なアップデートになって自分で調べるのがしんどくなってきました。

だれかに相談しながら調べたいな、と思って自社の会議室を使って少人数で集まっていました。

会の性質として、近くの人から相談がきたときに「このURLのページを見てみて」とかをさっと渡せるようにしたい、というのがあったので、Googleドキュメントを参加者間で共有して、メモ書きや課題の共有ができるようにしました。そのドキュメントは編集をロックして、イベントページに添付してあります。

参加者から、またやりたい、というリクエストがあったので、来月もやります。ずっと続く性質の会ではないかもしれませんが、困ったときに相談ができる相手がこういった場で作れると、別の機会でも協力しあえたりしてよいかと思います。

会の目的としては、アウトプットするためのインプットをする場がほしい、というものなので、自分が学んで満足したい、というのは会の範囲外としています。

lower_boundとupper_boundで区間抽出

lower_bound()upper_bound()でこんなことができたんだなーと発見できて楽しかったので、時間で区間を指定して抽出するのをやってみました。

簡易的なBoost.Interval Containerとして使えていいですね。

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

int main()
{
    std::vector<std::string> times = {
        "2018/12/31 00:00",
        "2019/01/01 00:01",
        "2019/01/01 01:15",
        "2019/01/01 03:30",
        "2019/01/01 08:23",
        "2019/01/01 10:50",
        "2019/01/01 13:20",
        "2019/01/01 15:30",
        "2019/01/01 18:00",
        "2019/01/03 23:59",
    };

    // 日付2019/01/01の午前中だけ取り出す
    auto first = std::lower_bound(times.begin(), times.end(), "2019/01/01 00:00");
    auto last  = std::upper_bound(times.begin(), times.end(), "2019/01/01 12:00");

    for (; first != last; ++first) {
        std::cout << *first << std::endl;
    }
}

出力:

2019/01/01 00:01
2019/01/01 01:15
2019/01/01 03:30
2019/01/01 08:23
2019/01/01 10:50

補足ですが、UTF-8とかの文字コードを指定しなくてもC++の規格で文字'0'から'9'までは順序が規定されているので、文字列の辞書順比較で日時の大小が決められます。月をJan、Febとかにしたら意図した動作にはなりません。数字以外の区切り文字とかが共通ならいけるので、「2019年01月01日」とかなら大丈夫です。月と日が2桁ゼロ埋めで揃えないといけない縛りとかはあります。

境界値のお試し。

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

int main()
{
    std::vector<std::string> times = {
        "2018/12/31 00:00",
        "2019/01/01 00:00",
        "2019/01/01 00:01",
        "2019/01/01 01:15",
        "2019/01/01 03:30",
        "2019/01/01 08:23",
        "2019/01/01 10:50",
        "2019/01/01 11:59",
        "2019/01/01 12:00",
        "2019/01/01 13:20",
        "2019/01/01 15:30",
        "2019/01/01 18:00",
        "2019/01/03 23:59",
    };

    // 日付2019/01/01の午前中だけ取り出す
    auto first = std::lower_bound(times.begin(), times.end(), "2019/01/01 00:00");
    auto last  = std::upper_bound(times.begin(), times.end(), "2019/01/01 12:00");

    for (; first != last; ++first) {
        std::cout << *first << std::endl;
    }
}

出力:

2019/01/01 00:00
2019/01/01 00:01
2019/01/01 01:15
2019/01/01 03:30
2019/01/01 08:23
2019/01/01 10:50
2019/01/01 11:59
2019/01/01 12:00

C++ MIX #3 を開催します

日程が決まりました。2019/04/17 (水) 19:00〜21:00です。

前回、抽選期間が長すぎたので、今回は1.5日程度で抽選します。このあたりはまだまだ試行錯誤しています。

noexceptがついてないファイルシステム操作

C++17のファイルシステムライブラリは、エラー時に例外を投げるバージョンと、error_codeへの参照をパラメータにとって例外を投げないバージョンの2つが用意されています。

ですが後者についても一部、例外を投げる可能性がある関数があります。 戻り値でpathオブジェクトが返る関数にnoexceptが付いていないのですが、それはreturn時にメモリ確保に失敗したことによって例外が起こりえます。

そういう関数にはnoexceptが付いていません。

参照

C++ MIX #2 開催案内

2月に、C++周辺の勉強会であるC++ MIXを開催します。

今回、参加枠は先着順ではなく抽選になります。一部の方にはご不便をおかけすることになるかもしれませんが、ご了承ください。

Boost 1.69.0がリリースされました

Boost 1.69.0がリリースされました。リリースノートはいつものように、日本語訳 + 情報補完したものをboostjpサイトで公開しています。

今回、新ライブラリとして安全な整数演算をするためのライブラリSafe numericsが入りました。

また、ライブラリをビルドするときに、Boost.Buildではデフォルトでvisibilityがhiddenになります。

Boost.Systemがヘッダオンリーになって使いやすくなっています。

その他、リリースノートを参照してください。

C++の勉強会を新しく企画しました

cppmix.connpass.com

C++ MIX」という名前で、新しい勉強会を @okdshin さんと企画しました。

休日に勉強会開催をするのはパワーがすごく必要でたいへんなので、いまのところ継続性を重視して平日夜に2時間程度の開催ということにしています。

Boost.勉強会は、勉強会の名前でBoostネタにしばられてしまう、ということが長い間指摘されていたこともあり、今回Boost.勉強会がもともと意図していた「C++周辺の勉強会」であることがわかる名前にしてあります。

cpprefjp : <filesystem>のリファレンス作成が完了しました

2017年11月から作業していたので、10ヶ月もかかってしまいました。 引き続き、C++17のライブラリと言語仕様のメジャーな機能を優先的に作業し、C++20も合間を見て作業していきます。

Boostの創始者Beman Dawes氏が引退

1998年5月にBeman氏が提案したことからBoost C++ Librariesプロジェクトがはじまりました。そこから20年が経ったことを期に、Beman Dawes氏がBoostから引退されます。

彼が作成したFilesystem、Timer、Endianといったライブラリは、他者にメンテナンスが移譲されます。

C++界隈ではこれまでにも何人かの著名な方がC++から引退されています。

  • 『Effective C++』シリーズ著者のScott Meyers
  • Boost.MPL作者、『C++ Template Metaprogramming』著者のDave Abrahams (現在はApple社でSwift開発に携わっている)
  • 『Modern C++ Design』著者のAndrei Alexandrescu (現在はD言語の開発者)