レビュー『Boost C++ Application Development Cookbook』

新たなBoost本 『Boost C++ Application Development Cookbook』

id:wraith13 さんに送っていただいたので、読んでました。

この本の内容を一言で表すと、boostjpサイトでやっている「Boost逆引きリファレンス」です。

Boostは100以上のライブラリが含まれている巨大なプロジェクトなので、どこから始めればいいかわからない、という方向けに、「こういうことがやりたい!」から「どうやれば?」と調べる本になっています。

英語の本ですが非常に読みやすいので、初めて洋書を読む、という方はこの本から取り組んでみると入りやすいんじゃないかと思いました。

この本の各Tipsは、以下のような構成になっています。

  1. こんなことがやりたい
  2. 前準備として、このライブラリのリンクと、このライブラリの知識が必要だよ
  3. それをどうやって実現するか
  4. この機能は内部的にこんなことをしてるんだよ
  5. その他追加情報
  6. 詳細情報へのリンク

すごく親切な作りになってるので、手元に一冊置いておくと、便利に使えると思います。

対象となるBoostのバージョンは1.53.0です。Boostのコミッターが書いてるので、品質も安心です。

Boost.勉強会 #14 東京を開催しました。

Boost.勉強会 #14 東京 - boostjp

2014年3月1日(土)に、IIJさんの会場をお借りして、Boost.勉強会 #14 東京を開催しました。

資料は、上記boostjpページにまとめてあります。

私が話したことは、まずオープニング。

Boost.勉強会はわりとなーなーで運営してきたので、今回明確に「Boost.勉強会ルール」というのを導入しました。「発表会じゃなく勉強会なので、周りのことはあまり気にせず、質問はどんどんしていいんですよ」というだけですが、参加者の方々はいちおうご一読を。

私は今回、2つの発表をしました。

cpprefjpを支える技術

http://melpon.org/pub/cpprefjp

C++のリファレンスサイトcpprefjpでの、運営ツールについて話しました。

今回、私は初めて2人での発表をしてみたのですが、そこそこうまくいった気がします。

Boost.Graphの設計と、最短経路アルゴリズムの使い方いろいろ

タイトル通り、Boost.Graphの設計について話しました。

この資料を作りつつ今までの発表を振り返って、「自分はどんだけテンプレートが好きなんだ」と思ったりしました。

グラフは応用範囲が非常に広いデータ構造なので、気になった方はこの機会に遊んでみるといいと思います。

謝辞

Boost.勉強会の準備・進行はだいたいいつもなーなーでやってる関係で、勉強会当日に参加者の方々を急遽スタッフに抜擢してヘルプをお願いしてたりします。

入場のお手伝いをしていただいたyou_and_iさん、魔導書の販売をしていただいたかなはるさん、配信をしていただいたfadis_さん、ありがとうございました。

発表者と参加者の方々も、ありがとうございました。みなさんのおかげで、多くの有意義な議論ができたと思います!

次回はおそらく、5月の札幌になると思います。主催のhotwatermorningさんにバトンタッチ!

C++14 Fundamentals TS shared_ptrの配列サポート

N3920 Extending shared_ptr to Support Arrays, Revision 2

C++14後のLibrary Fundamentals TSでは、std::shared_ptrの配列サポートが予定されています。

std::unique_ptrのように、配列での部分特殊化を用意するのではなく、内部的にstd::is_array特性を使ってdeletedelete[ ]か、operator[ ]を定義するかどうかなどを分岐するようです。

std::shared_ptr<int[]> p(new int[3]);

p[0] = 3;
p[1] = 1;
p[2] = 4;

std::shared_ptrに指定できる型の形式は、従来のstd::shared_ptr<T>に加えて、std::shared_ptr<T[]>std::shared_ptr<T[N]>が許可される予定です。

Boostでは1.53.0から、配列をサポートしています。

なお、shared_ptrオブジェクトを作るヘルパ関数make_shared()の配列サポートも検討されていますが、

N3939 Extending make_shared to Support Arrays, Revision 2

これは現状、Technical Specificationには予定されていません。

参照

C++14 gets削除

C言語互換ライブラリの<cstdio>ヘッダで定義されていた、標準入力から1行を読む関数std::gets()が、C++14から削除されることになりました。

これは、C11でgets()関数が定義されなくなったので、それに合わせてC++14でも削除される、という参照仕様の単なるバージョン更新対応になります。

gets()関数は、バッファオーバーランのセキュリティ的な事情で、C99から非推奨になっていた関数です。C99以降はこの関数を使うと警告が出ていたはずなので、そこから15年経った今では、使っている人はほとんどいないはずです。

参照

C++14 シグナルハンドラでできることの制限緩和と明確化

N3910 What can signal handlers do?

これまでのシグナルハンドラに関する規定では、以下のような問題がありました。

  • 制限が強すぎるためにハンドラ内ではvolatile std::sig_atomic_tかロックフリーアトミックオブジェクトの変数しか扱えなかった。
  • 未定義動作となる仕様があったために、汎用的なシグナルハンドラを書くのが難しかった。

この提案では、ハンドラ内で使えるオブジェクトの制限が緩和され、volatileやロックフリーオブジェクトでなくてもシグナルハンドラ内で定義・使用できるようになります。ただし変数に対する操作は、ロックフリー操作のみが許可されます。

いまの提案仕様では、mutexは使えないそうです。ロックフリー操作で実装される、スピンロックのようなクラスは可能。

メモリオーダーの観点で仕様が見直されたので、未定義動作も少なくなります。

参照

C++14 Fundamentals TS 変数テンプレート版のType Traits

N3932 Variable Templates For Type Traits (Revision 1)

C++14で、型を返すType Traitsに対するエイリアステンプレート版が追加されることになりましたが、この提案は、値を返すType Traitsに変数テンプレート版を追加するというもの。

// これまで通りの、値を返すType Traits
constexpr bool b = is_const<T>::value;

// 変数テンプレート版
constexpr bool b = is_const_v<T>;

変数テンプレート版は、valueを意味する_vサフィックスが付きます。(初期提案は_cだった)

この提案は、std::optionalと同じくC++14後のLibrary Fundamental TSで導入される予定です。

参照

C++14 Fundamentals TS ランダムサンプリング

N3925 A sample Proposal, v4

C++14後のLibrary Fundamentals TSでは、<algorithm>ヘッダに、ランダムサンプリング(無作為抽出)の関数std::sample()が追加される予定です。

template <class PopulationIterator,
          class SampleIterator,
          class Distance,
          class UniformRandomNumberGenerator>
SampleIterator sample(PopulationIterator first,
                      PopulationIterator last,
                      SampleIterator out,
                      Distance n,
                      UniformRandomNumberGenerator&& g);

この関数を使用すると、入力のイテレータ範囲から、n個の要素を等確率で取得できます。

const std::vector<int> v = {1, 2, 3, 4, 5};

std::random_device seed_gen;
std::mt19937 engine(seed_gen());

// vから3要素を無作為に抽出
std::vector<int> result;
sample(v.begin(), v.end(), std::back_inserter(result), 3, engine);

for (int x : result) {
    std::cout << x << std::endl;
}

出力例

1
3
4

このアルゴリズムの代表的な実装方式:

  • 出力をランダムアクセスで行うバージョン : KnuthのAlgorithm R (Reservoir sampling)
  • 出力を前から順番に行うバージョン : KnuthのAlgorithm S (Selection sampling)

参照

C++14がDISフェーズに移行

Trip report: Winter ISO C++ meeting

C++14 is here - A view on computing

Issaquah会議が終わり、ここから5ヶ月間でDIS(Draft International Standard)の投票が行われます。

その後FDIS(Final Draft International Standard)となり、その次のIS(International Standard)が策定完了になります。

この手順で進めば、2014年の年末に完了予定。FDISの手順は必須ではないらしいので、その手順をすっ飛ばして夏頃にISになるかもしれないとのことです。

DIS段階ではもう、大きな修正は入れられないので、実質C++14の策定作業は完了しています。

C++14 randとrandom_shuffleが非推奨に

N3924 Discouraging rand() in C++14, v2

C++14では、std::rand()std::random_shuffle()が非推奨(deprecated)になります。

std::rand()は昔から問題があると指摘されていて(多くの実装で線形合同法が使われていたり、RAND_MAXが小さかったり)、明確にこの関数の使用を禁止する分野やプロジェクトも多かったので、非推奨になります。std::rand()の代わりに<random>ヘッダの乱数生成器と分布を使いましょう。

std::random_shuffle()std::rand()に依存したアルゴリズムなので、道連れで非推奨になります。std::random_shuffle()の代わりにstd::shuffle()を使いましょう。

参照