2006-01-01から1年間の記事一覧

「PならばQ」の式

!P || Q これが読みづらい Qの遅延評価のために関数にできない P ? Q : true なるほど・・・vector_example.hpp

さよならassert

前回の続き 要するにassertは意味が多すぎるので名前をつけよう、ということだ バグ潰しのためなのか事前条件なのか分からないassertがよくある 結局こうなった・・・ソースコード postconditionがあるときのreturnがマクロになってしまった []#include[] []<pstade/contract.hpp></pstade/contract.hpp>…

Design by Contract (DbC)

こんなものが提案されていた(必見)・・・Proposal to add Contract Programming to C++ function-try-blockでなんとかする試み・・・ソースコード 標準準拠のはず、だが、これは今までで一番怪しい 結局コンストラクタでお手上げになってしまった postcondit…

Rangeをconcatする

adobeにすでにあった・・・segmented_iterator これだけ変えれば怒られないだろう・・・concatenate_iterator 関係ないですが、やはり使うらしい・・・overload型 さて、*itがrangeを返すようなitをTopIterator、返されたrangeをBottomRangeと呼ぶことに(勝…

bool_testable

bool_testableというのが、Boost.Operatorsにいったん追加されたあと程なく削除されている・・・昔のoperators.hpp 完全な実装は無理なのかもしれない いまのところこうなった・・・ソースコード 参考文献 The Safe Bool Idiom Another safe_bool alternativ…

VC7.1付属のSTLのauto_ptrのバグ

以下のコードのように、コピー(Move)するauto_ptrのelement_typeが異なるとoperator auto_ptr_ref()が無限に再帰してスタックがとぶ どうもauto_ptr_refのコピーコンストラクタを呼ぶために再びこれが呼ばれるようだ コンパイラのバグではなくSTLのバグと思…

Copyableでないといけない場合

ひっかかるのはまれであると思いますが、以下のコードはGCC3.4ではエラーになる・・・参照 draft October 2005では修正されているようだ []#include[] []<boost/noncopyable.hpp>[]</boost/noncopyable.hpp>

nonassignable

CopyConstructibleだがAssignable(operator=)はいらないというのは結構ある にこっそりあるが単独のヘッダでは使えないようなので・・・ソースコード []#include[] []<pstade/assignable.hpp>[] []#include[] []<pstade/nonassignable.hpp>[]</pstade/nonassignable.hpp></pstade/assignable.hpp>

属するコンテナを持たないイテレータのdereferenceについて

iterator_facadeはReferenceが参照型でない場合、IteratorCagegoryをInputIteratorに格下げする 参照でないとForwardIteratorの規定(24.1.3/1 の最後の行)を満たせないから ForwardIteratorのdereferenceは参照型でなくてはいけないから (24.1.3/1) RandomAc…

さよならnew

これを実装してみました・・・ソースコード VC++とGCCのみ対応ですが、どちらもちょっとずつおかしいので怪しい これをポータブルにするは大変だと思う []struct[] []A0[][] { [][]A0[][]() { } };[] []struct[] []A1[][] { [][]explicit[] []A1[][]([][]int…

Matafunctionのカスタマイズにenable_ifが使えた

タグディスパッチはいらなくなった、かもしれない・・・参照 []#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>

lambda functorはassignableじゃない

default-constructibleではないどころかassignableじゃなかった Boost.Lambdaで作ったfilter_iteratorは不正 もちろんcopy-constructibleではあるので、それからassignableにして、さらにboost::optionalでdefault-constructibleにする 型へのadaptorのよう…

rangeをメモ化する

何重にもadaptorを重ねたrangeに複雑なアルゴリズムを適用するとすごく遅くなる そこで、memoize_range・・・ソースコード 実装に使ったspirit::multi_pass iteratorが謎だらけなので怪しい 要件がちょっと特殊なようでそのままでは使えなかった []using[] […

boost::tupleでfusion体験

boost::tuple用のアルゴリズムがzip_iterator.hppにこっそりある Boost.Fusionが待ちきれない人に これを使ってzip_range・・・ソースコード []#include[] []<iostream>[]</iostream>

const int 再び

const intを使うと、ODR違反が起きてしまう場合がある その条件が不明確のようだ・・・参照 標準にはアドレスが使用されないなら大丈夫と書いてある(3.2.5) boost::mpl::integral_cはODR違反の起きる前にそもそも定義がない・・・参照 というわけで、定義が…

Forwarding Problem 解決される

参照 []#include[] []<boost/detail/callable.hpp>[]</boost/detail/callable.hpp>

ios_base::Init

mainより前にstd::cout等を使う場合、ios_base::Initを使う前に定義する 実装について・・・参照 忘れる前に・・・ソースコード

LambdaとRangeを混ぜてみる

ソースはこれのoven/apply_range.hppあたり Boost.Lambdaのドキュメントはしみじみひどいと思う []{[] []BOOST_CHECK[][](([] []oven[][]::[][]equals[][]([] []std[][]::[][]string[][]([][]"efghijk"[][]),[] []oven[][]::[][]make_apply_range[][]([][]sr…

&x + 1は有効なiteratorか

有効である・・・参照

implicit_cast

ややこしいんですが、暗黙の変換も明示するとコードの意味が明確になる・・・参照 static_castは意味が多すぎて駄目である []#include[] []<boost/implicit_cast.hpp>[] []#include[] []<boost/optional.hpp>[]</boost/optional.hpp></boost/implicit_cast.hpp>

shared_container_iterator

BOOST_FOREACHは、一時オブジェクトをコピーして保持するが、当然、元のソースまでは手に負えない 元の一時オブジェクト std::string("abc") は、BOOST_FOREACHのループ内で使うころには消えている BOOST_FOREACHで使えるようにするために、iterator自身がリ…

dynamic initialization

ある種の静的なオブジェクトはmain関数の前に初期化されることは保証されていないらしい(標準の3.6.2の3) 実際には、 みんなやってきたので大丈夫 保証されてないと仮定すると矛盾が生じるので大丈夫 ということらしい・・・・・・参照 そこでヘッダに処理を…

The Scala Programming Language

これはすごい・・・The Scala Programming Language Javaをサブセットにしてしまう関数型言語であるらしい package pstade.study; import java.io._;

ヘッダでは、メンバでないconst intは使えない

要するに、翻訳単位に局所的なオブジェクトは何であれ、templateから参照しては駄目らしい・・・参照 やっぱりBoost.Lambdaは違反しているらしい 対策は、 無名名前空間の参照でオブジェクトを捕まえる コンパイル時定数がほしいなら、staticメンバ変数を使…

マクロをオーバーロードする

マクロの名前を変えたらいいだけなんですが、せっかくなので昨日のを使おう まさにBOOST_MPL_PP_IS_SEQというのが、Boost.MPLにこっそりありました 例として、ヘッダでオブジェクトを定義するマクロ・・・ソースコード 引数が、Sequenceか、valueというトー…

BOOST_PP_IS_UNARY

これで引数が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>

新コンパイルタイム・ポリモーフィズム(Metafunctionが要る場合)

メンバあるいはtag dipatchを使ったカスタマイズ boost::result_ofのカスタマイズにtag dispatchを付けた形に近くなった 結局は、型と型とマッピングなので ADLは使わない Metafunctionをspecializeするために、どうしても名前空間を開くことになるから enum…

新コンパイルタイム・ポリモーフィズム(Metafunctionが要らない場合)

結局、Metafunctionが要る場合と要らない場合に分かれるのではないかと思う まずMetafunctionが要らない場合 メンバとADLを使ったカスタマイズを利用 tag dispatchと同じことはenable_ifで代用(overload型の存在価値が決定的に) 継承階層を利用したい場合は…

has_xxx

どうもいわゆるhas_xxxはprivateメンバには使えないらしい・・・参照

enumerate_range

id:y-hamigaki:20060409のスレッドを使ったiteratorのおかげでid:mb2sync:20060408に意味が出てきた? Enumerableという概念を勝手に作って、このiteratorでSinglePassRangeを作る やれることはenumerateを使っても変わらないが、BOOST_FOREACHが使えるのは…