C++と色々

主にC++やプログラムに関する記事を投稿します。

まとめ

<boost/detail/lightweight_test.hpp>

概要 ちょっとしたテストが書きたい、でもちゃんとしたテスティングフレームワークを導入するのは重い…そんな時にboostのlightweight_testが便利です。 これはboost/detail/lightweight_test.hppにあります。detailディレクトリ以下なのでちょっと分かりにく…

BOOST_PP_ITERATE

以前の記事でBOOST_PP_REPEATについて書きました。 BOOST_PP_REPEATは似たような記述を繰り返す際に利用できます。例えば、以下の様です(このコード自体に意味はありませんが…) #include <boost/preprocessor/cat.hpp> #include <boost/preprocessor/repeat.hpp> #define VALUE(z, n, d) const int BOOST_PP_CAT(VALUE_, </boost/preprocessor/repeat.hpp></boost/preprocessor/cat.hpp>…

boost::any

boost::anyは動的型とも言われています。まるで動的型付け言語のようにboost::anyにはあらゆる型のオブジェクトを代入し、取り出すことができます。boost::anyに格納することが出来る型の要件は以下の3つです。 コピーコンストラクト可能なこと 例外に対して…

BOOST_PP_REPEAT

BOOST_PP_REPEATは引数に渡されたマクロを指定回数分展開するマクロです。 書式は以下のようになります。 BOOST_PP_REPEAT(c, m, d) cは、何回引数に渡されたマクロを展開するかの回数を指定します。 例えば5を入れれば指定されたマクロは5回展開されます。 …

boost::program_options

boost::program_options名前空間にあるクラスを用いると、コマンドライン引数(オプション)を柔軟に簡単に解析できます。自作アプリケーションでオプションをつけるのならば使わない手はないです。 具体的には、渡されたコマンドライン引数をコマンド毎に(…

ローカルクラス

C++では関数内にもクラスを定義することができます。このクラスはローカルクラスと呼ばれ、静的メンバを定義できない、ローカル変数にアクセス出来ない、関数の外からインスタンス化ができない、などの特徴があります。 ローカルクラスの使いどころを2つ紹介…

STLコンテナの要素の削除方法

シーケンスコンテナ(vector, string, deque)とlistと連想コンテナ(set, map, 以下略)、の3つに分けて整理します。 "c"は、その時のコンテナのインスタンスを表します。std::を省略しています。完全なコードではありません。 特定の値を削除したい時 ・シーケ…

型特性によるオーバーロード

型特性によるオーバーロードはいくつか方法がありますが、目的に合わせた方法をとるのが良いと思います。・何通りかの型特性でオーバーロードをしたい場合 ・ある型特性かどうかでオーバーロードしたい場合 ・ある型特性でしかオーバーロードしてほしくない…

コンストラクタを書いたつもりが関数宣言とみなされる

コンストラクタを書いたつもりが関数宣言とみなされる時があります。 これは俗に、「C++で最も奇妙な解析」と言われています。 以下の様な時です。 struct foo{}; struct hoge { //引数を1つ取るコンストラクタ hoge(foo f) : f_(f) { } void func(){} foo f…

boost::in_place

boost::in_placeを使うと確保したメモリにオブジェクトを後から構築できるようになります。 copy不可なオブジェクトも再構築で再代入のような振る舞いをさせられます。trivial destructorをもつクラスはデストラクトせずに再構築できます。 #include <iostream> #inclu</iostream>…

trivial class

trivial class wikipediaの定義によると、 trivial なクラス・構造体は、以下のように定義される。 コンパイラ定義のデフォルトコンストラクタを持つ。コンストラクタの default 指定の記法を用いてよい (SomeConstructor() = default;)。 コンパイラ定義の…

Visitorパターン

Visitorパターンはクラスを、データクラス(Acceptor)と処理クラス(Visitor)に分離し、データクラスを変更せずに新しい操作を定義できるようにするパターンです。 データクラスが異なるいくつかの要素を持ち、それらの型ごとに異なる操作が必要な時 データク…

boost::assign

コンテナを初期化や代入する際、push_back等を並べる必要がなく、簡単に書けるようになります。 イテレータ初期化に対応しているクラスなら使えます。サンプル #include <boost/assign.hpp> #include <vector> #include <list> #include <map> #include <string> using namespace std; int main() { using </string></map></list></vector></boost/assign.hpp>…

boost::signals2

C++のためのAPIデザイン読んでいて初めて知ったのでメモ。 複数の関数を入れられるstd::functionみたいなもの。 同じシグネチャの関数ポインタ・関数オブジェクトを複数登録して、まとめて呼び出すことができる。 呼び出す順序はデフォルトだと、登録した順…

boost::optional

夏休み中サボってしまった… マイペースで行こう() あ、自分のプログラムに関する理解が誤っているの気づいた方はコメントで突っ込んで頂けると嬉しいです…今回はboost::optionalを試してみよう boost::optionalは、T型に無効値を追加した型みたいなもの。C…

boost::lexical_cast

自分がboost全然知らないので勉強目的 かつ 身内への宣伝を兼ねて色々使ってみることにする。最初はboost::lexical_cast 使い方はとっても簡単で、C++式のキャストと同じ書き方で文字列→数値、数値→文字列の変換を行う。自作クラスでも型変換子だか、演算子…

POD型とnon-POD型

2012/3/19追記 この記事の情報はC++03のものです。C++11ではPOD型の定義が異なっています。POD(Plain Old Data)型とはコンストラクタがコンパイラが自動生成したデフォルトコンストラクタしか持たいない型のことです。int型やdouble型などの組み込み型、ま…