C++ Ramble

[数学]Mersenne Twister initialization problem

http://thread.gmane.org/gmane.comp.lib.boost.devel/120420
あんまり関係ないけれど,確か2002のバージョンはシードとして0を受け付けるんだったけか?(1998のバージョン(Boost1.32.0のMTの実装)はシードとして0を受け付けない)ま,ど〜でも良いけれど.さらに全然関係ないけれど,専門でもないのにMTの論文を読んだことがあったり.だってこういうのって気になるんだもん.結局論文の内容はあんまり理解できなかったけれど.
#おぉ,Mersenne Twisterはてなキーワードに登録されてる.

3項条件演算子の援用?

http://article.gmane.org/gmane.comp.lib.boost.devel/120412
これ見て思ったけれど,3項条件演算子型推論能力をTMPやGPあたりに援用して何か面白いことできないかにゃ?ちなみに3項条件演算子は(恐らく多くの人の直感に反して)比較的複雑な規則に基づいて戻り値の型が決定されます(5.16).

「等しくない」allocatorを持ったコンテナ間のswap

http://thread.gmane.org/gmane.comp.lib.boost.devel/120359
http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2004/n1599.html
もうちょい広い文脈の問題として捉えなおすと,「Policy-Based DesignによるクラスにおいてPolicyの異なるクラス間の相互運用性(interoperability)の問題」になるかなぁ.この問題はMC++Dでも取り上げられていないしにゃあ.PBDによって複数のPolicyによる組み合わせ爆発の問題が解けることは明確に述べられているけれど,interoperabilityの組み合わせ爆発の問題には触れていない.PBDにおける最大の課題だと思うけれど.
http://tinyurl.com/bkfjv
iteratorのinteroperabilityについてはBoost.Iteratorでドキュメント化されているけれど(http://tinyurl.com/dwtbb),policy-based smart pointerあたりだとかなり複雑な議論になるだろうなぁ.スレッドポリシーが異なるスマポ間でのやり取りとか考え出したら熱出てきそう.boost::shared_ptrがPolicy-Basedでない理由の1つは多分これだろうしにゃあ.もうちょい深い議論がどこかに落ちてないかにゃ?

Boost Algorithms Library

http://thread.gmane.org/gmane.comp.lib.boost.devel/120408
きたー!!目玉は固定長配列に対して位置を型で表現したiteratorを使うことによってloop unrollingを可能にするところか.後,sequence/range-based interfaceを志向しているところか.後者はすでにいくつかのrange系ライブラリで模索されているしにゃ〜.

policy_ptr

http://thread.gmane.org/gmane.comp.lib.boost.devel/120755
これかな?
http://tinyurl.com/7qm45
読んでる暇ない・・・.

C++ Template MetaprogrammingのExerciseの解答

http://thread.gmane.org/gmane.comp.lib.boost.devel/120796
http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?CPP_Template_Metaprogramming_Book_-_Answers_Page
いつかここで自分の解答晒そうと思っていたんだけれど先にやられてしまいましたな.

ADL hook

http://thread.gmane.org/gmane.comp.lib.boost.devel/120575
やっぱり伸びてる・・・.本当この問題根深いなぁ.Generic Programmingの基本的な部分に関わる議論なだけに,早く一定の方向性を示してほしいというのと慎重に議論してほしいなぁという思いが半々.
http://article.gmane.org/gmane.comp.lib.boost.devel/120923
おぉ!最初何しようとしているのか良く分からなかったけれど,よくよく見てみたらうまーじゃないか!!
RangeはAssignableであることを要求されないため,Rangeを取る関数は必ずRangeを参照で受ける必要がある.

template<class Range>
typename boost::range_iterator<Range>::type
range_begin(Range &r);

ところがこれだけだと一時オブジェクト(rvalue)に対してrange_beginが呼べない(非const参照引数はrvalueを受け付けない)ため,const参照のoverloadも必要になる.

MyRange f();

range_begin(f()); // コンパイルエラー.
                  // 一時オブジェクトに対してbeginを呼べない.

// なのでconst参照のoverloadが必要.
template<class Range>
typename boost::range_const_iterator<Range>::type
range_begin(Range const &r);

range_begin(f()); // const参照のoverloadがあればこれがOKになる

上のarticleの提案はユーザ定義型に対してカスタマイズしたrange_beginを提供する際に,非const参照のrange_beginを提供するだけで済ませようとするもの.
うみゅ,うまー.
http://article.gmane.org/gmane.comp.lib.boost.devel/120718
http://article.gmane.org/gmane.comp.lib.boost.devel/120885
http://article.gmane.org/gmane.comp.lib.boost.devel/120923
結局,

  • hookを呼び出すアルゴリズムは属する名前空間のqualification付きで呼び出す
  • アルゴリズムはhookをADL付き(即ちunqualified)で呼び出す(ADLを使うのはここだけ)
  • hookを特殊化したいユーザはhookである(恐らくライブラリ名のprefixが付いた)特殊な名前の関数をcustomizeする

な感じなのかな?読んだ感じでは今後もうちょい設計指針が揺れそうな予感.

Registrationなしでのtypeofエミュレーション in VC7.1

http://thread.gmane.org/gmane.comp.lib.boost.devel/120863

For example, Igor' Chesnokov from RSDN (Russian Software Development Network) has found a way to implement typeof() that does not require registration, and probably has compile-time performance of a native typeof.

ま〜〜じ〜〜で〜〜!!??
いや,これすごいんですよよよ???今までのtypeofエミュレーションの実装方法を知らないと「"Registration"が不要」とか言われてもまったく意味不明だと思うんですが,とにかくこれすごいんですよよよ???
簡単にだけ説明すると,今までのtypeofエミュレーションでは各々の型に対して"Registration"と呼ばれる操作が必要になります.これは型一つ一つに対して固有の整数値を割り当てる操作で

class my_class
{ };

// my_classを登録(registration)する

my_class c;
BOOST_TYPEOF(c) d; // registrationして初めて,
                   // my_classのオブジェクトに対して
                   // typeofエミュレーションが可能になる

こんな感じになります.このregistrationがtypeofエミュレーションで最もうっとうしい部分なわけです.ところが,上のarticleに書かれているのはVC7.1のバグを使えばこのregistrationが不要になるというとんでもないテクニックです.
はふ〜ん.
http://article.gmane.org/gmane.comp.lib.boost.devel/120944

Sadly (?) the bug that allows this to work is fixed in VC8.

"sadly"ってw.

静的メンバの有無に基づくSFINAE

template <class T>
int f(T, int(*)[T::value] = 0);

そうか,(GCCでは使えないみたいだけれど)こういう書き方もありか・・・.