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

3.3.1 Point of declaration

C++

初期化子の手前で有効になるので駄目 (3.3.1 -1-)

12.6.2 Initializing bases and members

C++

コンストラクタの仮引数とメンバ変数の名前が同じでもよい (12.6.2 -7-)

Boost.ForeachとBoost.RangeEx

Boost.Iteratorのboost::filter_iteratorは使い方がめんどう Boost.RangeExのboost::make_filter_rangeでその作業を自動化できる そのままBoost.RangeExの関数はもちろん、BOOST_FOREACHにも渡せる 以下のfind_fileの実装はKetchup Version1.02にあります []…

Boost.Intrusive

伝統的なリンクリストの構造体をContainer風に操作できる 伝統的なリンクリストはノードポインタを要素に埋め込むことでメモリアクセスの負担を軽くする CPUにとってアクセスが容易なメモリの塊(std::vectorなど)を利用してリンク構造を提供できる Boost.Ptr…

予約名

C++

2連のアンダースコアを含んではいけない 標準規格、説明

Boost.Null

大昔にボツになったと思われるものがSandboxにある しかしまた消えていた []#include[][] <boost/config.hpp>[][]namespace[] []poost[] {[]#if[][] !defined(BOOST_NO_MEMBER_TEMPLATES)[] []namespace[] []detail[] { []struct[] []null_type[]</boost/config.hpp>

Boost.PFTO

VC6やeVC4でPartial Function Template Orderingが使える ディスパッチ用の引数、'BOOST_PFTO int'を"primary"に、'int'をoverloadする方に加える BOOST_PFTOはlongと定義されていて、0で呼び出すとintが優先されてoverloadした方が呼ばれる Boost.Serializa…

Boost.Rangeの実装の仕方

古いコンパイラの場合は、boost::beginではなく、boost_range_beginをオーバーロードしないとコンパイルできない そのことがドキュメントされていない・・・参考 VC6で動くようにするためにはドキュメントされていない部分を実装しないといけない ATL/WTL CS…

APIへバッファを渡すいろいろな書き方

C++

[]#define[] []ARRAY_SIZE[]([]array[]) ([]sizeof[]([]array[])/[]sizeof[]([]array[][0]))[]template[]< []class[] []T[], []std[]::[]size_t[] []sz[] > []inline[] []std[]::[]size_t[] []array_size[]([]T[] (&[]array[])[[]sz[]]) { []return[] []sz[];…

Boost.Rangeとchar配列

char配列をboost::endやboost::sizeに渡すと、文字列と見なして、存在しない終端文字'\0'を探しに行く Boost.Arrayで回避できる Boost.RangeはMFCのCString用のrange関数をやる気がなさそうに持っている 参考

ほんとうのforループ

ほんとうに今まで知らなかった 突然気づいて驚いたのでBoostのソースコードを検索したらちゃんと使われていました []for[] ([]int[] []i[] = 0, []count[] = []toolbar[].[]GetButtonCount[](); []i[] < []count[]; ++[]i[]) { []// ...[] }

Boost.ConfigがeMbedded Visual C++ 4.0で定義する主なマクロ

BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS 実行時まで失敗が分からないので注意 BOOST_(APPEND_)EXPLICIT_TEMPLATE_(NON_)TYPEを必ず使うこと それでもコンパイルが通らない場合があった BOOST_NO_FUNCTION_TEMPLATE_ORDERING BOOST_NO_MEMBER_TEMPLAT…

Loki(Modern C++ Design)とBoost.MPLの対応のまとめ

おそらくアロケータ関連のもの以外の全てをboostは持っている Int2Type: boost::mpl::int_ Type2Type: boost::type Select: boost::mpl::if_ TypeTraits: Boost.TypeTraitsとBoost.CallTraits Big, Small: yes_type, no_typeなど 実装の詳細 NullType: boost…

reStructuredText

出力されるhtmlの見た目が一番きれいだと思う これだけではキーワードのハイライトはできないようだ 使い方はBoost.MPLなどのdocフォルダにソースが入っているので参考になる Boost風のスタイルシートがある(おそらくBoost 1.33.0の新規ライブラリのために) …

Multiple access

C++

多重継承によって、基底クラスの単一の名前に複数の継承経路からアクセスする場合、アクセス権のもっとも緩いものが考慮される これで救われた。DSEL(言語内言語)の設計では思わぬ文法が重要になる []class[] []W[] { []public[]: []void[] []f[](); }; []cl…

Boost.ParameterをATLで使う

ドキュメントが更新された。使い方が少し変わった。完成? _ATL_MIN_CRTを定義していると何も言わずにクラッシュするので注意。 []#pragma[] []once[][]#pragma[] []warning[][]( push )[] []#pragma[] []warning[][]( disable : 4100 )[][]#ifdef[][] _ATL_…

メッセージハンドラの実装

win32gui メンバ関数を静的オブジェクトの初期化を利用して自動的に登録しているようだ MFC メンバ関数を登録するために、メッセージマップが必要 WTLとketchup ただのif文をメッセージマップで作る notus まだ実装してないようだ

The ketchup message map library

納得のいく形になってきた。 まるで関係の無さそうなbiscuitとほとんど同じことをやっている。 MPL Sequenceとmpl::foldによるコンパイル時のコードの生成はコンパイルに時間がかかるので使えない。 代わりにBoost.PreprocessorとBoost.Waveで手作りする。 …

YARD風Lambda

C++

YARDと同じような方法でBoost.Lambdaの代替も作れるのでは。 []#include[][] <iostream>[] []#include[][] <vector>[] []#include[][] <algorithm>[] []#include[][] <functional>[][]#include[][] <boost/mpl/apply.hpp>[] []#include[][] <boost/mpl/identity.hpp>[] []#include[][] <boost/mpl/eval_if.hpp>[] []#include[][] </boost/mpl/eval_if.hpp></boost/mpl/identity.hpp></boost/mpl/apply.hpp></functional></algorithm></vector></iostream>

The biscuit parser library

C++

2週間もかけた割にはMr.Digginsから気のない返事しかもらえない reStructuredTextの出力するファイルは、Code Projectにほぼそのままで投稿できる

Boost.Range

STLのコンテナの要件を緩めたConcept 日常書くコードへの影響の大きいライブラリ begin(),end()をユーザに書かせなくてよくなる istream_iteratorのような変わった使い方をユーザに要求しなくてよくなる リソースの管理をrangeにまかせることができる ソース…

Boost.Spirit風YARD

C++

標準XMLのEBNFをほぼ忠実に再現できた 再帰もそのまま書けてしまう ソース []#include[][] <iostream>[] []#include[][] <fstream>[] []#include[][] <string>[][]#include[][] "biscuit/biscuit.hpp"[][]namespace[] { []using[] []namespace[] []biscuit[];</string></fstream></iostream>

YARD (Yet Another Recursive Descent Parser)

C++

シンプルで、生成されるコードが小さく、コンパイルも早い。これが正解だ。 ただし、back-tracking on star operationsはない。 インターフェイスが独特のため、少し書き足す必要があると思われる。 よく考えるとBoost.SpiritもBoost.Xpressiveも解析器をsta…

Boost.Parameter

named_paramsからparameterに名前が変わったらしい BOOST_MPL_LIMIT_METAFUNCTION_ARITYに依存しなくなっている(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERSはコンパイラの負担が大きく問題を起こすことがある) 古いドキュメント→名前空間をparameterにして、key…

Boost.Xpressiveのメモ

困ったらepsilon >>をつける 再帰的なregexを使うときはスタックに負担をかけないようにkeepする numeric_castは切捨てを許さない (detail/sequence_stack.hpp, line 88; 1.5を2にでもする) ソース

Boost.MPLでWTLのマクロの削除を試みる

ソースはこちら デバッグ時には、「全般→デバッグ情報の形式→行番号のみ(/Zd)、または無効」を選択しないとコンパイラがクラッシュすることがある 使用法は以下のような感じになる(この例でプログラムサイズはマクロより2KBほど大きくなる) []struct[] []big…

Boost.Fusion

Boost.Spiritに含まれ、Boost.TupleをFusion Sequenceとしてコンセプト化し、置きかえるもの MPL SequenceはFusion Sequenceの要件を満たす MPLは型を操作し、Fusionはオブジェクトを操作する 「fusion」とはコンパイルタイムとランタイムのプログラミングの…

マクロでオブジェクト指向

C++

boost::typeofのC++標準における実装の中で使われている 「オブジェクト」とは型名(のようなトークン)の後にデータメンバのインスタンス(のようなトークン)の続いたSequenceと定義する 例: (YOUR_CLASS)(data1)(data2) 「メンバ関数」は型名の後にアンダース…

Boost.PreprocessorのBOOST_PP_FORの実装の概要

マクロは再帰的に呼び出すと展開されないので、その場合は同じ機能を持つ違う名前の(違う数字が後ろについた)マクロを呼び出す boostの実装は、展開されないことを逆手にとって再帰呼び出しを検出し、上記の作業を自動化しているようだ []// if-like[] []// …

Boost.Serializationのリンクの仕方

なぜか明示的なリンクが必要 VC++で「C/C++ → 言語 → wchar_tをビルトイン型として扱う → はい」にするのを忘れないこと 参照:とらいきゃっち・ふぁいなりー []#define[] []BOOST_LIB_NAME[] []boost_serialization[] []// #define BOOST_LIB_DIAGNOSTIC yes…