わんくま横浜勉強会に参加したら発表してきた話.

わんくま同盟

昨日行われたわんくま横浜, nyaocat さんが発表するとのことでふらっと参加するかーと思ったら, 当日 nyaocat さんが風邪で病欠になっており, たまたま居合わせた僕があおいさんに見つかってしまい代理発表させられるすることになりました.

別に何の準備もしていなかったんですが, office にオートコレクトされてコンパイルエラーになるようなものだらけのスライドで20分発表した後, 闇鍋プログラミング勉強会のオープンステマをして, 最後に2月ごろにうちの院生の皆さん向けに作って公開していた Effective C++ になぞらえた C++11 時代のコーディングについて, あんどちんさんやえぴすてーめー先生などと議論形式というか, ツッコミ形式で話をして, なんとか発表時間50分を埋めましたとさ.

というか, よく考えたら Microsoft C++ MVP の居る前で「独自言語 VC++」とか最大級の dis をしたのはかなり勇気あったなと自分でも思います. だが悪いものに悪いというのはおかしくない!すみませんでした!*1

ちなみに当初発表予定だった Range と Iterator のスライドは僕は持っていないのでどうしようもないですが, 後半発表したスライドはあるので置いておきます.

あ, で途中突っ込みのあった strongly typed enum なんですが, enum -> interger へ変換するのは暗黙に変換可能ですが, integer -> enum は static_cast などをしてユーザの責任で enum の数値のどれかになっている必要があります. static_cast で integer -> enum の変換を行ったときの挙動は C++03 の enum でも同じ.

追記)enum class から integer へ変換するときも暗黙で変換できないっぽいです. ただ明示的に integer に変換できるのでより厳格になったと考えられます.

enum class Color {
  Red, Green, Blue
};

Color c0 = Color::Red;
Color c1 = static_cast<Color>(0);

assert(c0 == c1);

なんでこれ書いたんだろうと思ったら, 当時僕が enum 地獄に陥っていてアホみたいに長いプレフィックスが付いた enum を書き続けており, strongly typed enum 使えたらなあああが具現化してこうなっていたらしいです.

後, 型が指定できるようになったのが嬉しい. 発表中もありましたが OpenGL とか「色の値はこの型でビット並びはこうね」みたいなのが決まっているとき, 型が指定できるのは非常に使いやすいと思います.

後は仮想デストラクタの話, 仮想デストラクタは基本的に継承を考えているのであれば使わなければ死ぬわけですが, 継承を考えないときはパフォーマンス上の問題とか, 勝手に継承されて死ぬとかがあるので, 書いて欲しくない. 話にもありましたけど, 当時は仮想デストラクタは全部書けというのと, 可能ならば書かない, という本両方が存在していたようで, 理由がちゃんと書いてなかったりして暗黒時代っぽい感じらしいですね.

話を続けると, 継承を考える前に合成, コンポジションでなんとかする方法を先に考えるべきで, どうしようもなくなったときに継承を考えるのが良いと思います. なんだかんだで継承しなくて済むパターンの方が多いと僕は思いますので.

他にも色々言いたいことありましたが, 突然参加して発表して済みませんでした. 楽しかったです. ありがとうございました.

追記) 他の発表について

忙しすぎて忘れてた...

fadis_ さんの発表はプログラムに LLVM リンクして C++ の eval 作った的な話だったと記憶しているのですが, LLVM の内部の関数がメモリに展開するだけで, バイナリとしてファイルに一回保存しておきたいよね的な話がありましたね. それ Boost.Interprocess の Memory Mapped Files と Managed Memory Mapped Files を使えば, 後者でクラスオブジェクトを直接生成できる(Managed の方で用意されるアロケータが使えればいけたはず)気がするので, ファイル保存はできるが, 後はアドレッシング辺りが問題ですね. Interprocess には offset_ptr というメモリアドレスを相対的に表現できるような仕組みもあるので, がんばればいける?

えぴすてーめー先生*2 の発表は, 僕が Visual C++ を dis りすぎて恐ろしい反撃を食らったような感じがします. すみませんでした. というか TR2 既に実装されているところが出ていたということは知らなかった... イテレータのペアを取りたい時にどれを使えば良いのか, cbegin, cend の登場でさらにあれになってきた感じがします. C++11 は初心者に優しくなれたんだろうか... C++11 の話だけができればそうであるような気がしますね. C++11 の解説書籍もまだ全然ですし, Effective C++11 でないかなあ.

*1:助かった...

*2:変換できない...