読者です 読者をやめる 読者になる 読者になる

配列を任意の値で初期化(fill)したい

0で初期化するなら何の苦労もないのだけど、1とか10にしたいって時。C++ならstd::fillがあるので: int arr[5]; std::fill(arr, arr + _countof(arr), 10); と書ける。さらにstd::vectorには初期値をコンストラクタで指定できるから: std::vector<int> arr(5/*要素</int>…

C++11 チートシート

C++

C++11: A cheat sheet—Alex Sinyakov : Standard C++ 「C++03ではこう書いてたものが、C++11ならこう書けるよ」みたいな。すでに既存のC++をある程度知っている人がC++11に移行するときに便利だと思います。 こんな感じ。 Aという言語を知っている人がBとい…

Boost.Filesystem - ディレクトリ関係の操作

カレントディレクトリの取得とか。 // 初めてこの関数を呼んだときのcurrent_pathの値 path initial_path(); // カレントディレクトリを取得 path current_path(); // カレントディレクトリを変更する void current_path(path const&); // テンポラリディレ…

boost::filesystem::unique_path関数

unique_path関数は実は引数を取るようになっています。 path unique_path(const path& model="%%%%-%%%%-%%%%-%%%%"); path unique_path(const path& model, system::error_code& ec); デフォルト引数があるため引数を渡さなくても利用できますが、引数を渡…

boost::filesystem::pathに対する操作、問い合わせ

Boost.Filesystemには「pathを受け取って何かする」という関数が用意されています。 問い合わせ namespace fs = boost::filesystem; fs::path const dir("C:\\hom"); fs::path const file("hom.txt"); fs::path const path = dir / file; // ファイル or デ…

boost::filesystem::path

Boost.Filesystemにはファイル名やディレクトリ名といったパスを表すためのpathクラスがあります。 パスに対する色々な操作を行うことができます。 初期化 文字列を渡して初期化します。 boost::filesystem::path path("C:\\hom\\hom.txt"); パスの出力 oper…

任意のディレクトリの下にあるファイルを再帰的に見に行く

C++

昨日の、任意のディレクトリの下にあるファイルを再帰的に見に行く処理をC++でもやってみましょう。 Boost.Filesystemのboost::filesystem::recursive_directory_iteratorを使うと、再帰的に見てくれます。 #define BOOST_FILESYSTEM_VERSION 3 #include <boost/filesystem/operations.hpp> in</boost/filesystem/operations.hpp>…

このBoostライブラリは、あのBoostライブラリを利用しています

Boostのライブラリは他のBoostのライブラリを利用して実装されていることが多いです。AsioはThreadを利用していますし、MPLはその他の色々なライブラリの実装の助けになっています。そういった関係を抜き出してみました。ただの暇つぶしで特に意味はありませ…

oven::block

C++

インターフェイスの向き - 偏見プログラマの語り!を読んで、EnumWindows関数をアルゴリズムに渡したいという部分に既視感を覚えたのでぐぐってみたら、この手の関数はovenを使うとおいしく頂けるようになっているようです。元記事の話とは脱線してしまいま…

仕事で使っているBoostライブラリ

C++

前2つのエントリにあるコマンドを組み合わせて、プロジェクト中で使用しているBoostのヘッダファイルを検索してみました(ただの暇つぶしで、意味はありません)。 # こんな感じで抽出 ls -r -include *.cpp,*.hpp,*.h | grep '#include

ディレクトリ内のファイル一覧を取得する(Boost.Filesystem)

C++

find_file_rangeはWindows限定だし今ならBoost.Filesystemを使った方が良さそう、ということで試してみる。 #include <algorithm> #include <iostream> #define BOOST_FILESYSTEM_VERSION 3 #include <boost/filesystem.hpp> int main() { using namespace boost::filesystem; std::copy(directory_itera</boost/filesystem.hpp></iostream></algorithm>…

ディレクトリ内のファイル一覧を取得する(find_file_range)

C++

Windows限定ですが、find_file_rangeを使うと簡単に特定のディレクトリ下にあるファイルの一覧を取得できます。 #include <cstdio> #include <boost/range/algorithm/for_each.hpp> #include <boost/bind.hpp> #include <windows.h> #include "find_file.hpp" int main() { find_file::find_file_range ffrng("*.*"); boost::for_each</windows.h></boost/bind.hpp></boost/range/algorithm/for_each.hpp></cstdio>…

boost::shared_ptrでHMODULEなどを管理する

C++

追記: これが動くのは、そもそも、HMODULEが、ポインター型であることを前提としている。HMODULEがポインターであることを隠すために、わざわざHMODULEという名前を使っているというのに。このコードは、ポータビリティに問題があると言える。 http://cpplov…

Cppcheck(C++ソースの静的解析ツール)

C++

SourceForge.net: cppcheckHudsonのプラグインを漁っているときに見つけた、C++のソースコードを静的に解析してくれるオープンソースのツール。面白そうなので試してみました。 インストール githubにソースが公開されているので、git cloneなりgithub上のア…

boost::result_of<>で __stdcall な関数の戻り値を得られないのでどうにかしてみた

どうやら boost::result_of は __stdcall などの修飾子が付いている関数に対応していないようです。 // これはOK (s_result_type は int) typedef int (* success_t)(); typedef boost::result_of<success_t()>::type s_result_type; s_result_type a = 0; // これはNG (e</success_t()>…

cpplint

Google C++スタイルガイド 日本語訳 | textdrop久しぶりに読んだら、cpplintというツールが紹介されていました。C++ のソースコードが上記のスタイルに則っているかを調べてくれるようです。面白そうなのでちょっと試してみました。 $ cat before.cpp #inclu…

reverse_iterator

C++

STLのコンテナが持っている reverse_iterator 、便利なようで erase や insert ができなくて不便だなと思ったら、 base メンバ関数なんてものがあるんですね。これを使うと iterator が取れるので、 erase やらなんやらが呼べるようになるようです。始めて知…

MFCで作成したウィンドウがリソースをちゃんと解放しているか調べる方法?

C++

一度 DeleteWindow してから再度 Create する。リソースの解放漏れがあると、大体ASSERTで落ちてくれます。便利ですね。……おかげではまった(実行時に落ちまくり)わけですが、まぁ、自業自得ですね(その画面書いたのは自分じゃないんですが)。しかし、問題が…

int* array; みたいなのを Boost.Range で扱いたい。

C++

ラップするしかないのだろうか。 #include <iostream> #include <algorithm> #include <boost/range.hpp> template<class T> class Array { size_t m_size; T* m_ptr; public: Array(T* ptr, size_t n) : m_ptr(ptr), m_size(n) {} typedef T* iterator; typedef T const* const_iterator; iterator begin() </class></boost/range.hpp></algorithm></iostream>…

typename

C++

boost::range_iteraotr<>::typeを使うとコンパイルが通らない。たとえば以下のprint関数。letsboost::range悩んだ末Boost.Rangeのドキュメントを読んだところtypenameが必要らしい。 template<typename Range> void print( Range& r ) { typename boost::range_iterator<Range>::typ</range></typename>…

More C++ Idioms

C++

More C++ Idiomsいつの間にか日本語に訳されていた。ブクマ見ると今年の四月にはあったらしい。知らなかった……。

Boost.Accumulatorsを拡張する

Boost 1.36.0 から追加された Boost.Accumulators。統計関数がいろいろあるのですが、標準偏差がないっぽいなぁということで、作ってみました。拡張方法はドキュメントに書いてあるようなのですが読んでもよくわからなかったのでソース読みつつ適当にやって…

ゆの in C++

C++

http://subtech.g.hatena.ne.jp/cho45/20080708/1215450151 http://subtech.g.hatena.ne.jp/miyagawa/20080708/1215473551 #include <iostream> using namespace std; static int _ = 1; struct X_ { X_() { this->operator /(0); } X_& operator /(int a) { static ch</iostream>…

押したボタンによって生成するオブジェクトを変更したい場合などに、どういうコードを書くのが一番短く書けるだろうか

C++

ボタンと言うかまぁなんでもいいのですけど、引数に応じて生成されるオブジェクトを変更したい場合。それぞれのオブジェクトを生成する(newする)関数を作成し、それを配列に入れておいて、ボタンのインデックスに応じて呼ぶ関数を切り替えるのはどうか。最初…

融通が利かないなぁと思うところ

C++

まぁ当たり前のことなのですけれど……。 1 std::vector<float> x; std::transform(x.begin(), x.end(), x.begin(), std::log); // error log はオーバーロード関数なので、どの関数を呼ぶべきかコンパイラが判断できずにエラーになってしまいます。しかし、 int を渡</float>…

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 とみなされているんだと思いますが、これは規定の動作なのでしょうか。そこに落ちてい…