C++

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時点ではドキュメントが古い…

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 をカスタマイズす…

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 バイト目に出現しうる値は出現しないのですね. ビットパターンは…

シリアル値から UNIX Time (time_t) への変換

C++

Excel では,日付・時間の値を1900年1月1日からの通算日であるシリアル値と呼ばれる値で保持しているようです.また,シリアル値は小数であることもあり,その場合の小数点以下の値は,時,分,秒を日単位に直した時の値を表すようです. シリアル値の小数部…

const の取り扱い

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

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

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

「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 はあらかじめ固定しておくそうで…

RapidXML でのコンパイルエラー

RapidXML を使用していて良く分からないコンパイルエラーが発生したのでメモ.以下のコードをコンパイルしようとするとエラーが発生しました. #include <iostream> #include <istream> #include <fstream> #include <string> #include <vector> #include "rapidxml/rapidxml.hpp" template < class CharT</vector></string></fstream></istream></iostream>…

zip の解凍

zip の解凍クラスが必要になったので作成.C/C++ で zip を扱う場合,zlib のサンプルコードの 1 つである minizip を使うのが一番楽そうなので,このライブラリを利用したラッパクラスを作成することを考えます.zip は,複数のファイル/ディレクトリをひと…

配列やコンテナをストリームとして扱う

手元に配列や(string, vector, deque, などの)コンテナと言う形でデータを保持してるけれども,使用したい関数(メソッド)のインターフェース(引数)は istream と言うケースに遭遇することがあります.このとき,簡単な解決策として stringstream を利…

Microsoft Word 2007 のテキスト抽出

Word 2007 形式のファイル (*.docx) は,解凍すると word/document.xml に本文(テキスト文章,および書式)に関する情報が格納されてあります.以下は,その OpenXML ファイルからテキストだけを抽出するプログラム.何も考えずに適当に書いただけですが・…

RapidXML

XML ファイルを解析するときは(それしか知らないので)Ruby を使ってやっていたのですが,C++ のクラスの中に XML の解析部を組み込む必要が出てきたので真面目に C++ の XML パースライブラリを探すことにしました.togeの日記 でいくつかの XML パースラ…