Development

静的配列の要素数を取得する構文

Boost 勉強会に行く途中の新幹線で C++TT を読み返していて気付いた話題.引数に配列を取る場合,下記のように配列の先頭ポインタと要素数を指定する形にする事が多いと思います. template <class T> void put_element(const T* p, std::size_t n) { ... } これに対</class>…

Boost 勉強会メモ

感想 今更ですが更新.まずは,皆様ありがとうございました.周り全部はじめましてなせいもあって,あまりしゃべれませんでしたが,次があればもう少ししゃべっていこうと思います.自分の発表に関しては,内容どうこうよりも詰まりすぎとかそっちの方で残念…

const reference と一時オブジェクト

本の虫: rvalue reference 完全解説 で,C++0x で新しく導入される rvalue reference と言う機能とその使用例について,非常に分かりやすく説明されていました.これを読んでいて const の特徴の一つを思い出したので,今回はそれについて.関数の引数に con…

Boost.Filesystem

ディレクトリを走査する必要が出たので Boost.Filesystem を利用する事にしました.Boost のビルドを行っていなかったので,ビルドから始めてサンプルプログラムを実行するまでのメモ. Boost のビルド ビルドは以下の 2 コマンドで終了します. [boost_1_40…

名前空間の不思議

以前に CLX C++ Libraries のバグを指摘してくれたページが消えていたので,バックアップ代わりに.まず,以下のコードは(少なくとも,VC++, cygwin+gcc 4.x.x では)コンパイルエラーとなります. #include <cstdio> #include <sstream> namespace foo { /* ---------------</sstream></cstdio>…

キャスト演算子のオーバーロード

私が C++ を触り始めてから随分長い間知らなかった記述の一つにキャスト演算子のオーバーロードがあります.キャスト演算子は,関数などで求められている型(引数など)と実際に指定したクラスの型が違う場合,「求められている型にキャストする」と言う動作…

protected 継承の使い方

Container Wrappers - Life like a clown で STL のコンテナを継承しよう(と見せかけよう)と,最後らへんは迷走か?と言うレベルで頑張っていましたが,以下にもう少し単純な方法が紹介されていました. 2.STLのvectorをprotected継承してカスタマイズす…

Hello, Boost.PropertyTree!

追記 (2010/03/08) find()の戻り値で、見つかったかどうかの判定をit != pt.end()ではなくit != pt.not_found()と書くようになり、find()の戻り値の型もiteratorからassoc_iteratorに変更されています。この辺りは、Boost 1.42.0時点ではドキュメントが古い…

線分に矢印を描画する

ある線分(正確には,始点と終点の座標)が与えられた場合に,その線分を下図のように矢印で描画したいと言う要求に遭遇しました.ただし,今回の例では始点は常に原点 O(0,0) です.今回は,与えられた線分を描画する際に,終点を重心 G(x0,y0) とする正三…

RapidXml での空白文字の扱い

RapidXml では,xml_document の parse メソッドに与えるフラグ(テンプレート引数)で空白文字の扱いが変わります.空白文字の扱いに関して定義されているフラグは以下の通り. const int parse_trim_whitespace = 0x400; const int parse_normalize_whites…

template キーワード

RapidXML でのコンパイルエラー - Life like a clown で問題になっていた事がようやく解決できたのでメモ.本題に入る前に.C++ では,typename キーワードは 2 通りの使い方があります.一つはテンプレート引数として 「型」を取ることを宣言する場合で,も…

Container Wrappers

Container Accessors - Life like a clown で書いたコードでは,メンバ変数を初期化する前に基底クラスを(初期化前の)メンバ変数で初期化しているので問題が発生することがあるようです.改善方法ですが,More C++ Idioms/メンバによる基本クラスの初期化(…

Container Accessors

追記 ここで記述したコードには問題が含まれていたため, Container Wrappers - Life like a clown に補足記事を書きました.ファイルの解析など何らかの操作を行った結果をコンテナに格納し,そのコンテナから各情報を取得するようなコードを書く機会にしば…

boost::tokenizer で scanf を作ってみる

Boost には printf() のような動きをするクラスとして boost::format がありますが,scanf() のような動きをするクラスは(多分)ありません.そこで,今回は scanf() のような動きをするクラスを自作してみます.今回は,boost::tokenizer をカスタマイズす…

is と as

引き続き C#.現在さわっている C# のコードを眺めているとやたらと is やら as やらが出てきて,(やりたい事は何となく分かるけど)こいつらは何者なのだろうと思っていたのですが,本格的にコードを修正する必要が出てきたので調べてみました. プログラ…

Stream と StreamReader

いきなり C# の話.最近,C# を触らなければならない状況になったので少しずつメモしていきます.ある言語をさわり始めるときに,取りあえず覚えておいた方が良いものの一つに I/O の扱い方がありますが,C# では Stream と StreamReader がこれに当たるよう…

Microsoft Office ファイルの判別方法

ファイルタイプ判別関数群 - Life like a clown の補足記事.ここでは,Office 関連のファイルの判別方法だけ記述してみます. OLE2 旧 Office ファイル (DOC, XLS, PPT) は OLE2 と呼ばれるフォーマットで記述されています.したがって,DOC, XLS, PPT ファ…

ファイルタイプ判別関数群

先頭と末尾のマジックバイトを見る方法。この方法ってGIFとかPNGとか色々に応用できるので、その他のエントリも乱立する予感大。 はてなブックマーク - JPEG かどうかを判断する C のコード - tokuhirom's blog. http://d.hatena.ne.jp/tokuhirom/20090818/1…

コマンドラインから VC++ のコンパイラ (cl.exe) を使用する

以前に参考にしていた記事が消えていたのでまとめておきます.GUI など VC++ 固有の機能を特に使用することなく,標準ライブラリ(+α)のみを利用して C++ のコードを書く際には,糞重い IDE を起動したくない わざわざ新規プロジェクトを作成せずにコンパイ…

UTF-8 の文字列を操作するための補助関数群

UTF-8 の文字列を操作するための補助関数群を作ってみました.当初,find() などの特定の文字列を見つける部分の実装が面倒そうだなぁと思っていたのですが,UTF-8 の 2 バイト目以降には 1 バイト目に出現しうる値は出現しないのですね. ビットパターンは…

const の取り扱い

constメンバ関数は重要 - Faith and Brave - C++で遊ぼう より.const と言うキーワードは C++ の中でも重要な位置を占めています.そのせいもあってか,「コメントで IN とか OUT とか書く位なら const 使えバカ」「Effective C++ に載ってるんだから const…

グループ化された図形の位置・大きさの扱い

実装にクリティカルに響いてこない箇所はオープンな場所にメモする事にしてみる.いきなりこれだけ書いても意味不明ですが,ある程度メモが溜まったら目次でも作ります.Microsoft PowerPoint では「複数の図形のグループ化」と言う機能がありますが,この機…

終了処理とコピーコンストラクタ

コピーコンストラクタ(と代入演算子)はなかなか扱いの難しい代物ですが,今回は「デストラクタで何らかの終了処理を記述している場合」でのコピーコンストラクタの設計方針について検討します.例えば,以下のようなファイルの入出力処理を扱うクラスを考…

「C++ は難しいから」と言う定説

雑記. C++ は難しいから Java から始めた方が・・・ ここ最近(と言うか以前からずっとですが),上記のようなアドバイスを見かける機会が多かったせいか「C++ の何を指して(Java と比べて)難しいと言っているのだろう?」と言う事を単純に疑問に思うよう…

静的型付け言語におけるダックタイピング (Type Erasure)

第127回 Ruby vs Java ダックタイピングとインタフェースで見る多態性 - bingo_nakanishiの他言語出身者のためのPerl入門 を読んで、「静的な型付け言語もやればできる子なんです」と言うところを少しは見せる事ができればと、今さらなネタですが書き起こし…

俺コーディング規則

最近,他人が自分のコードを読んだり修正したりする機会が増えてきたので,意思疎通のために自分のコーディング規則をメモしておきます.CLX C++ Libraries も(たまにブレてますが)ここに挙げる規則に従って書いているので,コードを読む際の参考にでも.…

Factory

メモ.今,以下のようにベースとなるクラス shape と shape を継承した様々なクラスがあります.このとき,プログラムから渡される名前を元にして生成するオブジェクトを変えたい場合,どう書くのがベストなのかな・・・ class shape; class triangle : publ…

ビットマスク

最近,上位(下位) N ビットマスクが必要となる事が多く,その都度考えるのが面倒になってきたのでビットマスク用のテンプレートを作成します.作成すると言うほどのものでもありませんが. template < int LowerBits, class Type = unsigned long > struct b…

コンパイル時チェック (STATIC_CHECK)

template で定義してるんだけど wchar_t の対応をまだ考えてないクラスが多くなってきたので,そう言ったクラスはいっそ char 以外で使われたらコンパイル時にエラーメッセージを出してしまうようにしようと STATIC_CHECK を実装してみました.しかし,Moder…

固定小数点数を double に変換

固定小数点数と呼ばれるものに遭遇したので,取り合えず double に変換する事を考えます.固定小数点数とは,(short, int や long などの整数型の)下位 N ビットを小数点以下の数値用に使用する方法で,固定と言う名の通り N はあらかじめ固定しておくそうで…