C++

配列を任意の値で初期化(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++ でメモリリークの検出を行えるようにしてみましたが、それをとても簡略化したものを試しに自分で実装してみました。かなりいい加減ですが(テス…