constinit, consteval, constexpr, const の違い

constexpr関数 constexpr関数はその関数がコンパイル時にも評価可能であることを表す。静的(コンパイル時)な評価を強制される箇所でなければ動的に実行される。 メンバ関数に用いる場合にC++11では暗黙的にconst修飾されていたがC++14以降const修飾されなく…

一般的な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…

SiSグラフィック搭載機にLinuxをインストールするメモ

症状 Ubuntuをインストールしようと試みるもGUIインストーラ自体が起動せずインストールできない。 原因 X.orgのSiSドライバ内においてモニタのEDID解釈部分でセクションの拡張を考慮していないためにSEGVする。 対処 インストーラが起動する前の画面が紫色…

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

C++

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

NGINXでlocalhost:80のサーバーを立てるメモ

設定ファイルは /etc/nginx/nginx.conf この中に include /etc/nginx/sites-enabled/*; としている箇所があり、./sites-enabled/default を読み込んでいる defaultにはlocalhost:80の設定がある。なので#でコメントアウトして#include /etc/nginx/sites-enab…

スレッドの終了を考える

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言語についての記述もありますが、共通した記…

Linuxでアプリを自動起動

Linuxでアプリを自動起動(Windowsのスタートアップ相当)するならinit.d等ではなくデスクトップ環境や各ウィンドウマネージャの設定を使うのが簡単で良いようです。たとえばLXDEでskypeを自動起動するなら/etc/xdg/lxsession/LXDE/autostartに(Lubuntuなら…

ALSAの作法とか

自分で試してみた限りのことを書きます。snd_pcm_openの引数に"hw:0,0"を渡す例が多くみられるがこれはデバイスを独占してしまうためお行儀がよろしくないと思われる。そこで出力先は"default"やミキサーの"plug:dmix"にするとよい。これでほかのプロセスか…

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…

マルチスレッドと落ちるウィンドウ

複数のスレッド内でウィンドウを作りメッセージループを回すということを何回も繰り返すと落ちる現象に遭遇しました。最初はスレッド関連か呼び出し規約など色々疑いましたが結局の原因はAT○Kでした。 デバッガの呼び出し履歴 WindowProc -> DefWindowProc -…

std::mapのkeyをスライドしたい

何年も前にstd::mapに格納されているkey群を指定量だけ一気にずらしたいと思い、slidable_mapとでも呼べるデータ構造を考えました。つまり格納されているkeyが1,5,8だとしてそれぞれを+2だけずらし3,7,10としたいわけです。愚直に個々のkeyを修正すればコス…

RGBからCMYKへ変換するには

RGBとCMYKカラーの変換には簡単な変換式はありませんし、完全に可逆の変換が出来るわけでもありません。また用途に応じて変換方法も違ってきます。 まずは適切なiccプロファイル(RGB,CMYK)を用意します。CMYKのプロファイルとしては日本で印刷するなら ( Jap…

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>…