C++ Tips

UnicodeからShift-JISへの変換、どうする?

なし崩し的にDelphi Advent Calendar 2012に記事を書く羽目になった件について。(ぉぃ まぁ、実業務でのちょっとした覚え書きな件もあるので、いい機会だし久しぶりに更新してみる。ここ数年でプログラミング環境はUnicodeを意識せざるを得なくなった。DBの…

clang 3.1をWindowsで使ってみた

次期C++BuilderのC++コンパイラがLLVM/clangになる*1というので、早速いじってみた。まずはインストール。現時点でWindows上でclangを動かすにはmingwが必要とのことで、まずはmingwのインストール。 http://sourceforge.net/projects/mingw/files/Installer…

スマートポインタの使い方 その3:メモリ以外のリソースをスマートポインタで管理する

デリーターとは スマートポインタが管理できるのは、メモリ領域だけではなく「構築」と「破棄」がペアになっている任意のリソースも管理できる。 例えば、Cのfopen関数でオープンしたファイルをfclose関数でクローズしたり、あるいは、Windows APIのGDIオブ…

スマートポインタの使い方 その2:shared_ptr

shared_ptrを使ってみる unique_ptrが変数の寿命が尽きた段階でメモリ領域を開放するのに対し、shared_ptrは参照カウンタを持ち参照カウンタがゼロになるとメモリ領域を開放する。 #include <tchar.h> #ifdef __BORLANDC__ #include <boost/tr1/memory.hpp> namespace std { using namespace</boost/tr1/memory.hpp></tchar.h>…

スマートポインタの使い方 その1:unique_ptr

スマートポインタって何? C++において、operator newでメモリ領域(ヒープ領域)を動的に確保した場合、その領域はoperator deleteでプログラマが責任を持って解放してやらなければならない。しかし、deleteを書き忘れたり、例外が発生したときの処理を怠っ…

static_castとreinterpret_castの違いについて試してみた

昨日のネタのうち、キャスト関連は思い込みとか理解不足なところがあったので、実際に動かしてみた。 //--------------------------------------------------------------------------- #include <iostream> #pragma hdrstop #include <tchar.h> //----------------------------</tchar.h></iostream>…

「C++プログラマであるかを見分ける10の質問」に答えてみた。

「C++プログラマであるかを見分ける10の質問」に答えてみた。自分の解釈だとこんな感じ。正解かどうか、特に2のreinterpret_castと10は自信なし。ちなみに、Java版は/.Jの日記で。 1. iterator の役割について説明せよ. ポインタがメモリのアドレスを指し示…

BOOST_FOREACHの使い方

C++のコンテナ類を列挙するときに便利なのがboost::foreach。可変長配列であるvectorを列挙する場合は以下の感じ。 //--------------------------------------------------------------------------- #include <iostream> #include <string> #include <vector> #include <boost/foreach.hpp> #include <tchar.h> //-</tchar.h></boost/foreach.hpp></vector></string></iostream>…

エンコーディング判別・変換ライブラリ「バベル」の使い方。

第12回デベロッパーキャンプでネタにしたmlang.dllのDetectInputCodepageがBOM無しUTF-8をWindows-1252と誤判別するので、代替としてバベルを使ってみる。使い方はヘッダファイルbabel.hをインクルードして、プロジェクトにbabel.cppを追加するだけ。以下は…

正規表現チェッカーの技術的な解説もどき

今回リリースした正規表現チェッカーはBoostにかなり依存しているのだけど、コアとなるboost::regexだけではなく、 boost::foreach boost::preprocessor boost::shared_ptr なんてものを使ってます。特に、boost::preprocessorはかなり協力。VCLコンポーネン…

ストリーム入出力を使用して、文字コードがUTF-8なファイルを読み書きする

Boostのutf8_codecvt_facetをインクルードして、imbueでストリームに設定してやればOK。 libs/detail/utf8_codecvt_facet.cppもインクルードしてやらないとリンクエラーが発生。 UnicodeStringをstd::wstringにしてもちゃんと読み書きできる。 参考URL: htt…

Boost String Algorithms Libraryの使い方 その2:文字列比較系関数

残念ながら、比較系の関数群はC++Builder2010では動作しない。ソースは不本意ながらも(マテ)Visual Studio 2008で動作したのをコピペ。 1.contains/starts_with/ends_with containsは文字列を「含んでいる」か、starts_withは「始まっているか」、ends_withは…

boost::optionalを使って、Nullableなイテレータを実装する

boost::optionalは通常の値に「無効値」を加える仕掛け。 関数などの戻り値でNULLとか0とか-1を「無効値」と扱うケースがあるけど、そうはいかない場合に有効。 あるいは、STLコンテナの「どこも指していない」イテレータが欲しい場合とか。 //-------------…

C++0xのムーブセマンティクス(値のつなぎ替え)と右辺値参照

Faith and Braveさんの記事を参考に、C++Builder 2009で試してみた。 //--------------------------------------------------------------------------- #include <iostream> #include <utility> #pragma hdrstop #include <tchar.h> //------------------------------------------------</tchar.h></utility></iostream>…

自分用覚え書き:テンプレートと文字列リテラルの罠のようなもの

C++ Templates: The Complete Guideの57ページにこんなコードがあった。 //--------------------------------------------------------------------------- #pragma hdrstop #include <tchar.h> #include <string> //-------------------------------------------------------</string></tchar.h>…

自分用覚え書き:特殊化テンプレート関数の記述方法(その2)

C++ Templates: The Complete Guideが来たので、ちょっと目を通してみた。 そしたら、前に思ったテンプレート引数が必要なケースがいきなり例題で出てきた。//--------------------------------------------------------------------------- #include <iostream> #prag</iostream>…

自分用覚え書き:特殊化テンプレート関数の記述方法

#include <iostream> #include <string> template<typename T> int compfunc(T a, T b) { std::cout << "compfunc(T a, T b)" << std::endl; return a - b; } template<> int compfunc<std::string>(const std::string& a, const std::string& b) { std::cout << "compfunc(const std::string& a, const </std::string></typename></string></iostream>…

Google C++ スタイルガイド日本語訳

Google C++ スタイルガイド日本語訳が公開されたけど、結構面白い。 ただ、ちょっと気になる部分があって、 "-inl.h"ファイル 必要な場合、"-inl.h"という接尾辞を持ったファイルを使って複雑なインライン関数を定義することができます。 なんだけど、これっ…

ソースコード整形ツールあれこれ

C/C++/Javaのソースコード整形ツールはGNU indentとかArtistic Styleとかいろいろあるけど、個人的にグッと来たのは、Uncrustifyかな・・・。 で、そいつらのGUIフロントエンドがUniversalIndentGUI。 こいつはこいつで使い道がありそうだけど、全角文字がだ…

BCC32でのSingletonパターン

アプリケーションの設定状態などを記憶する場合など、昔はグローバル変数を使っていたけれども、最近のトレンドはSingletonパターン。 手軽に実装すると以下のような感じになるはず。 class CFoo { private: CFoo() {} CFoo(const CFoo& foo){} ~CFoo(){} pu…

Boost String Algorithms Libraryの使い方 その1:trim/trim_left/trim_right

VCLのAnsiStringやMFCのCStringと比べて、C++標準の汎用文字列クラスであるstd::stringは機能が貧弱。そいつを補完するのがboostのString Algorithms Library。 以下はその簡単な使い方。 1.trim/trim_copy trim関数は文字列の両端から空白を除去する。trim_…