閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

C++

GetProcAddressで戻り値をキャストするのが面倒くさいので少し考えてみた

C++

その1。 typedef void (__stdcall * Func)(); template<class F> F GetProcAddress2(HMODULE module, LPCSTR name) { F f = reinterpret_cast<F>(::GetProcAddress(module, name)); _ASSERT(f); return f; } Func f = GetProcAddress2<Func>(dll, "Func"); ってASSERT挟んだだ</func></f></class>…

非ポインタ型の変数にポインタを代入

C++

struct A { A(A* = 0) {} void foo() {} }; int main() { A obj = new A(); obj.foo(); return 0; } 上記のコードはコンパイルも実行も普通にできます。最初見たときはちょっとびっくりしましたが、普通にコンストラクタが呼ばれるんですね。当然、 new で確…

cl.exeを落とす

C++

以下のコードをコンパイルすると cl.exe が強制終了します。バージョンは VC8 。 #include <boost/bind.hpp> struct Hoge { void foo(int) {} }; void main() { Hoge hoge; boost::bind(&Hoge::foo, hoge); } まぁコンパイルの通らないコードなので落ちても構わないのですが</boost/bind.hpp>…

BOOST_FOREACH で std::map を使うとエラーが出る事がある

C++

#include <map> #include <boost/foreach.hpp> void f() { std::map<int, int> m; BOOST_FOREACH(std::map<int, int>::value_type const& iter, m) { } return 0; } これ VC8 でコンパイルが通りません……。エラーが大量に出るのですが、その前に BOOST_FOREACH の引数が多すぎると言う警告(C4002)が出るの</int,></int,></boost/foreach.hpp></map>…

new をオーバーロードしてメモリリークを自力で検出

C++

new や malloc を自分で定義すればメモリ領域を確保する度にそれを記録することができます。前のエントリで VC++ でメモリリークの検出を行えるようにしてみましたが、それをとても簡略化したものを試しに自分で実装してみました。かなりいい加減ですが(テス…

メモリリークの自動検出をしてみる

VC++ のライブラリにはメモリリークの検出機能があります。関数ひとつ呼んでおくだけでアプリケーション終了時にメモリの解放漏れを出力ウィンドウに表示してくれるという便利なものなのですが、実際にこれを使うまでの過程に罠が多いのでメモしておきます。…

pstade::egg::pipable

C++

ベイダー日記の方更新してから思い出したけど、C++でPipeline operatorのようなことって、pstate::eggで既にやっているのを見たような……。 http://vader.g.hatena.ne.jp/wata_d/20080221/1203583962 探したらありました。 #include <iostream> #include <pstade/egg/pipable.hpp> using namespa</pstade/egg/pipable.hpp></iostream>…

F#の Pipeline operator もどきをC++で実装してみた

C++

>演算子をオーバーロードして、F#の Pipeline operator のようなことをやってみました。 #include <iostream> #include <boost/function.hpp> using namespace std; int one() { return 1; } int two() { return 2; } void print_func(int n) { cout << n << endl; } struct print_obj { vo</boost/function.hpp></iostream>…

CINT

C++

CINTというC/C++のインタプリタがredditで紹介されていたので試しに入れてみました。404 Not FoundWindows版はコンパイル済みのバイナリがあるので、それを使うと簡単です。cint.exeを起動して、適当に打ち込んでみます。 cint.exe> { char* str = "Hello wo…

オーバーロード関数をアルゴリズムに渡す

C++

高階関数へオーバーロードされた関数を渡す - Faith and Brave - C++で遊ぼう関数オブジェクトをかますとキャストが不要になるようです。余計回りくどくなっている気もしますが……。 #include <string> #include <vector> #include <algorithm> using namespace std; double stod(const s</algorithm></vector></string>…

不完全クラスのdeleteに注意

C++

pImplイディオムを使っているところでメモリリークしていた。調べてみると、pImplクラスの解放をauto_ptrに任せていたのが原因らしい。orz // Hoge.h class Hoge { Hoge(); private: struct pImpl; std::auto_ptr<pImpl> impl; }; // Hoge.cpp struct Hoge::pImpl {</pimpl>…

三項演算子を入れ子にすることでインラインで分岐(else if)する

C++

int hoge = true ? 0 : false ? 1 : 2; しかしこういうスタイルは可読性が悪いので使用しないほうが良いでしょう。いやちょっとしたプログラム書いてるときにif書くの面倒だなあと思ったら出てきたので。ちゃんとした(?)プログラムでは使うつもりはないです…

CPenでペン作ろうとしたらコンパイルが通らない罠

黒いペン作ろうとしたらコンパイルエラーに。 CPen pen(PS_SOLID, 1, 0x000000); // オーバーロード関数の呼び出しを解決することができません。 CPenにはコンストラクタが2つあって、 CPen( int nPenStyle, int nWidth, const LOGBRUSH* pLogBrush, int nSt…

連結リストの要素を全て削除する

C++

連結リストを自前で実装したときに、デストラクタがあると要素を全て削除するのが楽でいいですね。 #include <iostream> using namespace std; struct list { char* name; list* next; list(char* name) : name(name), next(0) {} ~list() { cout << name << endl; del</iostream>…

VCでSetWindowLongPtrを使用したときの警告の対処法

32ビット環境ではSetWindowLongPtrはSetWindowLongのエイリアスになります。それとは別に、VCのデフォルトでは /Wp64 オプションが有効になっています。これは64ビットOSへの移植性が損なわれる場合に警告を出すと言うもので、 void* p = &p; unsigned long …

フィボナッチ数を求めるプログラム

C++

C++版。g++ 4.0.1でコンパイル。 再帰 #include <iostream> using namespace std; template<int N> struct fib { enum { Value = fib<N-2>::Value + fib<N-1>::Value }; }; template<> struct fib<1> { enum { Value = 1 }; }; template<> struct fib<0> { enum { Value = 0 }; }; int m</n-1></n-2></int></iostream>…

More C++ Idioms

C++

More C++ Idioms - Wikibooks, open books for an open world (via C++ Truths: New book on modern C++ idioms)C++のイディオムがまとめられています。Scope Guardとか聞いた事があるものもありますが、知らないのも結構あるっぽい。Named Parameterとかは…

C++-0x

C++

Update on the C++-0x Language Standard - Visual C++ Team Blog - Site Home - MSDN Blogs なんか更新されたらしい。Variadic TemplatesとかSUGEEEEE! と思ったけど数ヶ月前から話題になってたんですね。最近C#ばかり触っていたので全然知りませんでした。…

ソートしてなくても動くuniqueを書いた

C++

std::uniqueは引数のコンテナの要素がソートされていることを前提に作られているのですが、最近C#ばかり触っているおかげですっかり忘れていました。思い出すのまで3分くらいぼーっとしてしまった。で、ソートしたら重複した要素はなくなったのですが、ソー…

本屋

川崎のあおい書店に技術書が多く揃っているという事で行ってきたのですが、品揃えが豊富ですごかったです。面白そうな本がたくさんあってうろうろしているだけで楽しかったです。レジに辿り着く頃には2時間くらい経っていました。とりあえず、あまりお金もな…

message_once

最速インターフェース研究会 :: Developer Enviroments Conference で発表してきましたにて公開されている資料にalert_onceというJavascriptで書かれた関数がありました。ループ中に何かエラーがあった時にメッセージを出したい、けど、ループ中にたくさんエ…

数学関数のエラーを処理する _matherr 関数

数学関数の引数に不正な値を与えるとエラーが発生しますが、_matherr関数を定義するとエラーが発生する直前に処理することができます。注:以下の記述はBorland C++ Compilerにて確認を行っています。環境によっては関数名や定数名が違ったり(gccではアンダー…

テキストファイルを読み込んでSTLのコンテナに格納する

たまにやろうとした時にいつも忘れてるのでメモ。 int main() { std::string text; std::ifstream ifs("hoge.txt"); text.assign(std::istreambuf_iterator<char>(ifs), std::istreambuf_iterator<char>()); return 0; } ちょっとしたファイルを読む時にはそれなりに使え</char></char>…

C++ クックブック

いつの間にか発売していたようで、早速買ってきました。C++クックブック作者: D. Ryan Stephens,Christopher Diggins,Jonathan Turkanis,Jeff Cogswell,株式会社クイープ出版社/メーカー: オライリー・ジャパン発売日: 2006/09/26メディア: 大型本購入: 1人 …

テンプレートパラメータを省略した時の動作

// Macにはまだcpp_to_hatenaが入ってないので色分けが... cout 上記のようなコードをBCCでコンパイルして実行すると、どちらも結果が「6」になります。つまり std::max とみなされているんだと思いますが、これは規定の動作なのでしょうか。そこに落ちてい…

メソッドチェーンを使用した名前付き引数の実装

メソッドチェーンというのは、関数の戻り値としてオブジェクトを返すようにして、その戻り値のオブジェクトのメンバ関数を直接呼んで関数呼び出しを繋げていく様なコードの書き方を指します。のですかね? ……ちょっとその辺はよくわからないのですが、ともあ…

配列や構造体の初期化

配列や構造体は、以下の構文で初期化することができます。 int arr[10] = {1,2,3}; この時、配列の 0〜2 番目の要素は順に 1,2,3 で初期化されます。では、それ以降の 3〜9 番目の要素はどうなるのかというと、強制的に 0 で初期化されます。これを利用する…

ハンガリアン記法

間違ったコードは間違って見えるようにする - The Joel on Software Translation Project後半に、ハンガリアン記法の本来の用途が解説されている。ずっと、変数名に型情報を表すのがハンガリアン記法だと思い込んでいました。というかどこ見てもそう書いてあ…

if 文の式の中で宣言した変数のスコープ

if の式の中で宣言した変数は、 else 節の中(という表現でいいの?)では存在してないのかと思ったら……。>if(hoge* ptr = getPtr()) { cout << ptr->hoge(); } else { // このブロックにも ptr 変数は存在する }

|| 演算子

C++ では、 f(false || "hoge"); とした場合、関数 f には真偽値 (true) が渡されますが、JavaScript や多くの Lightweight Language では真となる方の値をそのまま返すようです。この例の場合は文字列が返ってきます。 // JavaScript alert(false || "hoge"…