C++

一般的なalias問題

C++

前々回、前回と strict aliasing rule について紹介しましたが今回は一般的なalias(別名)の問題について紹介します。 以下の関数は深刻な問題を抱えています。お分かりいただけるでしょうか。 // x*2 + x*2を計算し結果をyに格納する。 ただしxは十分に小さ…

strict aliasing rules, type punning解説 その2(union)

C++

前回述べた strict aliasing rules の集成体とunionのルールについては分かりずらいです。自身も誤解していた部分があったので追加で解説を試みます。このルールに該当するコードは以下のようものだと思っていましたが違うようです。 struct s { int i; }; s…

strict aliasing rules, type punning解説 その1

C++

strict aliasing rules つまり元の型のオブジェクトを別の型のオブジェクトとして使用すること(type punning)は基本的にできないというC/C++におけるルール。 つまり以下のようなことはできず、未定義動作を引き起こします。 float value = 0; int i = *(int…

イマドキのメンバ変数のリソース管理とPImpl

C++

クラスにメンバ変数を持たせるには struct Name { Type member; }; これが普通ですが時には不満が出てきます。例えばメンバ変数の生成タイミングを遅らせたいなど、クラス寿命の範囲内でメンバ変数の寿命を管理したい場合や、#include する Type の定義が重…

スレッドの終了を考える

C++

別のスレッドを中断して終了したい場合どのように設計したらよいでしょうか? 昔悩んだことをメモしてみました。メインスレッドから重い処理をさせるワークスレッドを止めたい場合を考えてみます。 //work thread while(true) { // do work } //Main thread …

C++の記号一覧 (List of C++ symbols)

C++

.ep { color:red; font-weight:bold; } table, tr, td, th { border: solid 1px #333 !important; } 検索のしづらいC++の記号の意味をまとめてみました。C++11、C++14をはじめとして網羅的に集めたつもりです。 C言語についての記述もありますが、共通した記…

Boost.TypeErasureのドキュメント翻訳

訳してみました。型や関数ごとの説明以外は訳してあります。 本家Boost.TypeErasureSteven WatanabeCopyright © 2011-2013 Steven WatanabeDistributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at …

正規表現の正規表現をboost.xpressiveで記述する

C++

正規表現の文字列を正規表現ライブラリへ渡す前にフィルタリングしたくなったので正規表現自体の正規表現を書いてみました。 つまり事前に必要の無い表現を弾いたり、新たな表現を追加したりなんて事がしたいわけです。 記述に当たって普通の正規表現で書こ…

boost::graph グラフコンテナと共に頂点記述子もコピーする

C++

adjacency_listのグラフをコピーする際に注意することがあります。 VertexListにlistSなど指定しているとvertex_descriptorはコピー先で使用できないということです。vecSの場合vertex_descriptorは整数インデックスなので問題ないと思いますが他はポインタ…

変数と同じ値の定数をテンプレート引数に渡す。

C++

つまり以下のようになる。 template <int N> void Function(); void Call(int n /* 0-2 */) { if (n == 0) { Function<0>(); } else if (n == 1) { Function<1>(); } else if (n == 2) { Function<2>(); } } Callに渡された変数nに対応するFunctionを呼び出す。 予</int>…

関数の戻り値で悩むことってよくありますよね

C++

関数の戻り値などで複数の状態を表したい場合、enumを使うのが正しい方法だと思います。 しかしながらついついint型を使用して-1だとか2だとかを直接書いてしまったりします。でもこれはなるべく避けたいところです。 そこでマルチキャラクタリテラルが使え…

(char*) とか書いていませんか? sign_cast作ってみた

C++

よく文字列やバッファを扱う関数でchar*とunsigned char*が変換できずに(char*)とか書いてませんか? これはかなり危険な書き方なのでやめた方がいいです。C形式のキャストをやめてC++形式のキャストを使っても危ないです。 static_castだと変換できません。…

C++0x(gcc 4.5.1 only)用のstatic ifライブラリを作ってみました。

C++

C++にもstatic ifが欲しいと思い作ってみましたが、かなり苦戦しました。 やっぱり言語ネイティブでサポートして欲しいですね。C++0xの規格の範囲ではどうやっても無理そうで、gccの挙動に依存してます。 STATIC_IF library for C++ · GitHub 利点 static if…

STL シーケンスから最後の要素を探す

C++

最初の要素を検索するならstd::findが有りますが、後ろから検索するアルゴリズムは標準には有りません。そこでreverse_iteratorを使用してみます。 std::vector<int> v; v.push_back(10); v.push_back(20); std::vector<int>::reverse_iterator ritr; if ((ritr = std:</int></int>…

boost 1.38からswapライブラリが入りました。

C++

#include <boost/swap.hpp> // 配列のスワップをサポート void test1() { char a[5], b[5]; std::swap(a,b); //NG (C++11以降から可能になった) boost::swap(a,b); } // 「std::」の有無 struct basket{ void swap(basket& b){} //fast and exception-safe swap }; void swap</boost/swap.hpp>…