2006-01-01から1年間の記事一覧
!P || Q これが読みづらい Qの遅延評価のために関数にできない P ? Q : true なるほど・・・vector_example.hpp
前回の続き 要するにassertは意味が多すぎるので名前をつけよう、ということだ バグ潰しのためなのか事前条件なのか分からないassertがよくある 結局こうなった・・・ソースコード postconditionがあるときのreturnがマクロになってしまった []#include[] []<pstade/contract.hpp></pstade/contract.hpp>…
こんなものが提案されていた(必見)・・・Proposal to add Contract Programming to C++ function-try-blockでなんとかする試み・・・ソースコード 標準準拠のはず、だが、これは今までで一番怪しい 結局コンストラクタでお手上げになってしまった postcondit…
adobeにすでにあった・・・segmented_iterator これだけ変えれば怒られないだろう・・・concatenate_iterator 関係ないですが、やはり使うらしい・・・overload型 さて、*itがrangeを返すようなitをTopIterator、返されたrangeをBottomRangeと呼ぶことに(勝…
bool_testableというのが、Boost.Operatorsにいったん追加されたあと程なく削除されている・・・昔のoperators.hpp 完全な実装は無理なのかもしれない いまのところこうなった・・・ソースコード 参考文献 The Safe Bool Idiom Another safe_bool alternativ…
以下のコードのように、コピー(Move)するauto_ptrのelement_typeが異なるとoperator auto_ptr_ref()が無限に再帰してスタックがとぶ どうもauto_ptr_refのコピーコンストラクタを呼ぶために再びこれが呼ばれるようだ コンパイラのバグではなくSTLのバグと思…
ひっかかるのはまれであると思いますが、以下のコードはGCC3.4ではエラーになる・・・参照 draft October 2005では修正されているようだ []#include[] []<boost/noncopyable.hpp>[]</boost/noncopyable.hpp>
CopyConstructibleだがAssignable(operator=)はいらないというのは結構ある にこっそりあるが単独のヘッダでは使えないようなので・・・ソースコード []#include[] []<pstade/assignable.hpp>[] []#include[] []<pstade/nonassignable.hpp>[]</pstade/nonassignable.hpp></pstade/assignable.hpp>
iterator_facadeはReferenceが参照型でない場合、IteratorCagegoryをInputIteratorに格下げする 参照でないとForwardIteratorの規定(24.1.3/1 の最後の行)を満たせないから ForwardIteratorのdereferenceは参照型でなくてはいけないから (24.1.3/1) RandomAc…
これを実装してみました・・・ソースコード VC++とGCCのみ対応ですが、どちらもちょっとずつおかしいので怪しい これをポータブルにするは大変だと思う []struct[] []A0[][] { [][]A0[][]() { } };[] []struct[] []A1[][] { [][]explicit[] []A1[][]([][]int…
タグディスパッチはいらなくなった、かもしれない・・・参照 []#include[] []<string>[] []#include[] []<boost/lexical_cast.hpp>[] []#include[] []<boost/type_traits/is_base_of.hpp>[] []#include[] []<boost/utility/enable_if.hpp>[]</boost/utility/enable_if.hpp></boost/type_traits/is_base_of.hpp></boost/lexical_cast.hpp></string>
default-constructibleではないどころかassignableじゃなかった Boost.Lambdaで作ったfilter_iteratorは不正 もちろんcopy-constructibleではあるので、それからassignableにして、さらにboost::optionalでdefault-constructibleにする 型へのadaptorのよう…
何重にもadaptorを重ねたrangeに複雑なアルゴリズムを適用するとすごく遅くなる そこで、memoize_range・・・ソースコード 実装に使ったspirit::multi_pass iteratorが謎だらけなので怪しい 要件がちょっと特殊なようでそのままでは使えなかった []using[] […
boost::tuple用のアルゴリズムがzip_iterator.hppにこっそりある Boost.Fusionが待ちきれない人に これを使ってzip_range・・・ソースコード []#include[] []<iostream>[]</iostream>
const intを使うと、ODR違反が起きてしまう場合がある その条件が不明確のようだ・・・参照 標準にはアドレスが使用されないなら大丈夫と書いてある(3.2.5) boost::mpl::integral_cはODR違反の起きる前にそもそも定義がない・・・参照 というわけで、定義が…
参照 []#include[] []<boost/detail/callable.hpp>[]</boost/detail/callable.hpp>
mainより前にstd::cout等を使う場合、ios_base::Initを使う前に定義する 実装について・・・参照 忘れる前に・・・ソースコード
ソースはこれのoven/apply_range.hppあたり Boost.Lambdaのドキュメントはしみじみひどいと思う []{[] []BOOST_CHECK[][](([] []oven[][]::[][]equals[][]([] []std[][]::[][]string[][]([][]"efghijk"[][]),[] []oven[][]::[][]make_apply_range[][]([][]sr…
有効である・・・参照
ややこしいんですが、暗黙の変換も明示するとコードの意味が明確になる・・・参照 static_castは意味が多すぎて駄目である []#include[] []<boost/implicit_cast.hpp>[] []#include[] []<boost/optional.hpp>[]</boost/optional.hpp></boost/implicit_cast.hpp>
BOOST_FOREACHは、一時オブジェクトをコピーして保持するが、当然、元のソースまでは手に負えない 元の一時オブジェクト std::string("abc") は、BOOST_FOREACHのループ内で使うころには消えている BOOST_FOREACHで使えるようにするために、iterator自身がリ…
ある種の静的なオブジェクトはmain関数の前に初期化されることは保証されていないらしい(標準の3.6.2の3) 実際には、 みんなやってきたので大丈夫 保証されてないと仮定すると矛盾が生じるので大丈夫 ということらしい・・・・・・参照 そこでヘッダに処理を…
これはすごい・・・The Scala Programming Language Javaをサブセットにしてしまう関数型言語であるらしい package pstade.study; import java.io._;
要するに、翻訳単位に局所的なオブジェクトは何であれ、templateから参照しては駄目らしい・・・参照 やっぱりBoost.Lambdaは違反しているらしい 対策は、 無名名前空間の参照でオブジェクトを捕まえる コンパイル時定数がほしいなら、staticメンバ変数を使…
マクロの名前を変えたらいいだけなんですが、せっかくなので昨日のを使おう まさにBOOST_MPL_PP_IS_SEQというのが、Boost.MPLにこっそりありました 例として、ヘッダでオブジェクトを定義するマクロ・・・ソースコード 引数が、Sequenceか、valueというトー…
これで引数がSequenceかどうかを調べられる・・・参照 ただし、調べられる引数は限られる(Tupleを渡したりはできない) Boost.TypeOfで使われている []#include[] []<boost/preprocessor/detail/is_nullary.hpp>[] []#include[] []<boost/preprocessor/detail/is_unary.hpp>[] []#include[] []<boost/preprocessor/detail/is_binary.hpp>[]</boost/preprocessor/detail/is_binary.hpp></boost/preprocessor/detail/is_unary.hpp></boost/preprocessor/detail/is_nullary.hpp>
メンバあるいはtag dipatchを使ったカスタマイズ boost::result_ofのカスタマイズにtag dispatchを付けた形に近くなった 結局は、型と型とマッピングなので ADLは使わない Metafunctionをspecializeするために、どうしても名前空間を開くことになるから enum…
結局、Metafunctionが要る場合と要らない場合に分かれるのではないかと思う まずMetafunctionが要らない場合 メンバとADLを使ったカスタマイズを利用 tag dispatchと同じことはenable_ifで代用(overload型の存在価値が決定的に) 継承階層を利用したい場合は…
どうもいわゆるhas_xxxはprivateメンバには使えないらしい・・・参照
id:y-hamigaki:20060409のスレッドを使ったiteratorのおかげでid:mb2sync:20060408に意味が出てきた? Enumerableという概念を勝手に作って、このiteratorでSinglePassRangeを作る やれることはenumerateを使っても変わらないが、BOOST_FOREACHが使えるのは…