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

関数を定義する方法2006

ようやく関数の定義の仕方が分かってきたのでまとめておこう Iterator AdaptorのためにFunctionObjectはできるだけDefaultConstructibleかつAssignableにしておいた方がいい この不具合の回避策がかなり正確に分かった 基底クラスを持つか、あるいはユーザ定…

result_ofの使い方

関数オブジェクトfooと、その型op::foo(cv-qualifierなし)があるとする result_ofにはop::fooを渡すことになる (op::fooの参照型を渡してはいけないと思われる 20.5.4/1) 厳密には、result_ofだと思うのだが、constは付けないらしい (参照) 関数テンプレート…

Range AdaptorをBoost.Spirit風にする

開発中のBoost.Protoを使って演算子のオーバーロードをしてみる (実装) result_ofにはまだちゃんと対応してないようだ 以前の使い方([id:mb2sync:20051025])とは、かなり変わっている []#include[] []<pstade/oven/compile.hpp>[]</pstade/oven/compile.hpp>

Placeholder Expressionの罠

型がMetafunctionであるかないかでapplyの動作が変わる PlaceholderExpression自体がill-formedになり得る 型でないパラメータを取る場合機能しない デフォルトでは、template parameterの数が5個より多いと動作しない boost::tupleなんかは駄目である GCC3…

マクロに型を渡す

テンプレートを利用した型はコンマで区切られていることがあるので([id:Cryolite:20050326])を使うのだが、const修飾が消える (13.1/3) VC++7.1は消えないので注意 コンマを保護するマクロを呼ぶのはユーザの責任になる こうすればどうだろう (実装) affect…

(Im)perfect Forwarding

引数は5個まで (実装) 試しに10個にするとコンパイル時間が大変なことになった これもただの実験コードというわけではなく、 Boost.Lambda functorを一時オブジェクトを実引数に取れるように変換できる lambda::ret<>に相当する機能を付けられる 関数オブジ…

object generator再び

前回([id:mb2sync:20061210])のはマクロになってしまったが、マクロなしでもできた (実装) []#include[] []<utility>[] []#include[] []<pstade/object_generator.hpp>[]</pstade/object_generator.hpp></utility>

object generator

make_pairなどのコードは大体似通っている 自動化してしまえ (実装) 結局マクロになってしまった []#include[] []<utility>[] []#include[] []<pstade/object_generator.hpp>[] []#include[] []<boost/tuple/tuple.hpp>[]</boost/tuple/tuple.hpp></pstade/object_generator.hpp></utility>

callable

オリジナルのcallableにresult_ofのサポートをつけると、偶然にも?そのままこの回避策になってちゃんとVCでも動く! 実装とサンプル これで関数との戦いは終わった

untupled関数

tupleを取る関数を普通の関数に変換する (実装)と(サンプル) これはただ面白いというだけではなく、「まずTupleを引数にとる関数を実装しておいて、それをuntupledに変換してユーザに提供する」という方法でプリプロセッサを使わなくてよくなる はずなのだが…

関数をpipeにする

関数呼び出しのシンタックスは醜い Range Library Proposalではoperator|を使った回避策が提案されている これはRangeに限った話ではないので、result_ofを使って書こう (実装) []#include[] []<boost/utility/result_of.hpp>[] []#include[] []<pstade/pipable.hpp>[]</pstade/pipable.hpp></boost/utility/result_of.hpp>

MFC/ATLのコレクションクラスと文字列クラスをRangeにする

今度こそ完成した、はず (ドキュメント) こういうものを作ると、これらのクラスは使ってはいけないとよく分かる! ただCSimpleArrayと文字列クラスは役に立つかもしれない ついでにWTLも サンプルコード

VC++7.1 Standard + SP1 + Toolkit

C++

SP1を当てても、Toolkitの最適化オプションは使えるようである link.exe, c1.dll, c1xx.dllがSP1によって更新されるようだ これ以外をToolkitのファイルで"上書き"すればいいと思われる 上書きしてからSP1を当てるのが確実 ライセンス的には未定義かもしれな…

tupled関数

関数をboost::tupleを取る関数に変更しよう (実装) HaskellでいうzipWithをするRangeに必要になった ([id:Cryolite:20061124]を参照) tie(xs, ys)|zipped|transformed(tupled(f)) を短く書ける Haskellでは map (uncurry f) (zip xs ys) になるようだ C++にc…

あっても(なくても)いいtypename

The keyword typename shall only be applied to qualified names, but those names need not be dependent. (14.6/5) 上の文は、最新のDraftでは(typenameのルールを緩くするため?)削除されているようだ []struct[] []X[] []{[] []typedef[] []int[] []typ…

using declaration vs using directive

[id:uskz:20061111]を調べていて(たぶんVC++のバグ?)、こんなものを発見 「using directiveを含む名前空間とそのusing directiveの対象となる名前空間の両方を含んでいる最も内側で取り囲む名前空間の中で宣言されたように見える。」 (7.3.4/2)

関数を作る

result_ofはやっぱりVC++ではうまく動かない (参照) たしか配列が絡むとさらによく分からないエラーになったと思う result_ofを直接Specializationすると動くのでそれを助けるライブラリ id:CryoliteさんのこれのおかげでBoost.Lambdaをサポートできた resul…

Concept vs ADL

decltype(typeof)のような機能があってもなお、ADLより明示的なカスタマイズの方がいいぞという提案 それをエミュレートする物のソースと例 なかなかうまくいった

Boost Installer

C++

VC++用のビルド済みのBoost 知らなかった 全部チェックすると1GBですけど

終わらないRange

よく考えるとistream_iteratorのRangeも永遠に入力しつづければ無限なので問題がない 以下のソースコードはこの辺り any_iteratorについては、ここやここ []#include[] []<boost/range.hpp>[] []#include[] []<pstade/oven/functions.hpp>[] []#include[] []<pstade/oven/ranges.hpp>[] []#include[] []<boost/lambda/lambda.hpp>[] []#include[] []<boost/lambda/core.hpp>[]</boost/lambda/core.hpp></boost/lambda/lambda.hpp></pstade/oven/ranges.hpp></pstade/oven/functions.hpp></boost/range.hpp>

template constructor vs copy-constructor part2

以下のコードはtest1でassertion failedとなる (2)は、'T=D'なので、暗黙に生成された(1)とのオーバーロード解決に勝利する test2では、(3)がB型にキャストすることによって(1)を優先するようにしているのでassertion failedにならない 何が問題かと言うと、…

std::distanceとReachable

std::distanceの結果が負になるようなことはあってはいけない ここの204 "or decrements"の意味が不明という話 iterator_facadeで使うdistance_toの引数はreachableとは限らないので注意

const-qualified function?

以下のコードで、(1)は不正 (8.3.5/4) GCC3.4とComeauではコンパイルできる 最新のDraftではconstは無視されるので合法になる?(参照) (2)は何が起こるべきなのか不明 VC++7.1/8とComeauではコンパイル出来る GCC3.4ではコンパイル出来たり出来なかったりす…

where_

cvsに新しいBoost.ConceptCheckとおぼしきものがある 見た目をConceptGCC(提案)らしくしているらしい チェック用のクラスの語尾に"Concept"は付けない whereを満たさないとdiable_ifしたりはしない Metafunctionとマクロのバージョンが用意されている 条件が…

さよならauto_ptr?

std::auto_ptrとboost::scoped_ptrをまとめてDeprecatedにするunique_ptr(旧名move_ptr)の提案がある unique_ptrの実装 Boost.Interprocess(cvs)にも含まれていてなぜか実装が二つある どちらもちょっとずつ駄目らしく今のところauto_ptr/scoped_ptrは必要な…

ザ・コンパイルタイム・ポリモーフィズム

とうとう答えにたどり着いた?かもしれません Metafunctionの要らない場合です []namespace[] []poost_extension[][] {[] []struct[] []hello[][] { };[][]}[]

template constructor vs copy-constructor

以下のコードはassertion failedとなる kはconst修飾されてないので、(2)が、(1)とのoverload解決に勝利する・・・参照 これが意図したものであることはまずないと思われるので(3)の定義を忘れないようにする コンパイラが暗黙に生成するcopy-constructorで…

iterator_castの力

Boost.RangeExにあるiterator_castは、adaptorからbaseとなったiteratorを取り出すのだが、名前に反してもっと汎用的なものだと思われる baseメンバ関数を介して、複雑に"修飾された"型のオブジェクトから欲しい型のオブジェクトを取り出す shared_ptrやopti…

mutableな一時オブジェクト

constでない参照は一時オブジェクトで初期化できない id:mb2sync:20060727が使えた to_streamはostream_iteratorと同じものです id:mb2sync:20060804のためにconst_castは使えないことに注意 []oven[][]::[][]copy[][]([] []file_range[][]<>([][]"x.txt"[][…

さよならラッパー

気づくのが遅すぎたかもしれない・・・window_ptr, window_ref []inline[] []void[] []enable_window[][]([][]window_ref[] []wnd[][], [][]bool[] []on[][])[] []{[]