C++ Tips
なし崩し的にDelphi Advent Calendar 2012に記事を書く羽目になった件について。(ぉぃ まぁ、実業務でのちょっとした覚え書きな件もあるので、いい機会だし久しぶりに更新してみる。ここ数年でプログラミング環境はUnicodeを意識せざるを得なくなった。DBの…
次期C++BuilderのC++コンパイラがLLVM/clangになる*1というので、早速いじってみた。まずはインストール。現時点でWindows上でclangを動かすにはmingwが必要とのことで、まずはmingwのインストール。 http://sourceforge.net/projects/mingw/files/Installer…
デリーターとは スマートポインタが管理できるのは、メモリ領域だけではなく「構築」と「破棄」がペアになっている任意のリソースも管理できる。 例えば、Cのfopen関数でオープンしたファイルをfclose関数でクローズしたり、あるいは、Windows APIのGDIオブ…
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>…
スマートポインタって何? C++において、operator newでメモリ領域(ヒープ領域)を動的に確保した場合、その領域はoperator deleteでプログラマが責任を持って解放してやらなければならない。しかし、deleteを書き忘れたり、例外が発生したときの処理を怠っ…
昨日のネタのうち、キャスト関連は思い込みとか理解不足なところがあったので、実際に動かしてみた。 //--------------------------------------------------------------------------- #include <iostream> #pragma hdrstop #include <tchar.h> //----------------------------</tchar.h></iostream>…
「C++プログラマであるかを見分ける10の質問」に答えてみた。自分の解釈だとこんな感じ。正解かどうか、特に2のreinterpret_castと10は自信なし。ちなみに、Java版は/.Jの日記で。 1. iterator の役割について説明せよ. ポインタがメモリのアドレスを指し示…
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コンポーネン…
Boostのutf8_codecvt_facetをインクルードして、imbueでストリームに設定してやればOK。 libs/detail/utf8_codecvt_facet.cppもインクルードしてやらないとリンクエラーが発生。 UnicodeStringをstd::wstringにしてもちゃんと読み書きできる。 参考URL: htt…
残念ながら、比較系の関数群はC++Builder2010では動作しない。ソースは不本意ながらも(マテ)Visual Studio 2008で動作したのをコピペ。 1.contains/starts_with/ends_with containsは文字列を「含んでいる」か、starts_withは「始まっているか」、ends_withは…
boost::optionalは通常の値に「無効値」を加える仕掛け。 関数などの戻り値でNULLとか0とか-1を「無効値」と扱うケースがあるけど、そうはいかない場合に有効。 あるいは、STLコンテナの「どこも指していない」イテレータが欲しい場合とか。 //-------------…
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>…
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++ スタイルガイド日本語訳が公開されたけど、結構面白い。 ただ、ちょっと気になる部分があって、 "-inl.h"ファイル 必要な場合、"-inl.h"という接尾辞を持ったファイルを使って複雑なインライン関数を定義することができます。 なんだけど、これっ…
C/C++/Javaのソースコード整形ツールはGNU indentとかArtistic Styleとかいろいろあるけど、個人的にグッと来たのは、Uncrustifyかな・・・。 で、そいつらのGUIフロントエンドがUniversalIndentGUI。 こいつはこいつで使い道がありそうだけど、全角文字がだ…
アプリケーションの設定状態などを記憶する場合など、昔はグローバル変数を使っていたけれども、最近のトレンドはSingletonパターン。 手軽に実装すると以下のような感じになるはず。 class CFoo { private: CFoo() {} CFoo(const CFoo& foo){} ~CFoo(){} pu…
VCLのAnsiStringやMFCのCStringと比べて、C++標準の汎用文字列クラスであるstd::stringは機能が貧弱。そいつを補完するのがboostのString Algorithms Library。 以下はその簡単な使い方。 1.trim/trim_copy trim関数は文字列の両端から空白を除去する。trim_…