Category Archives: C++

static_assertで型チェック

is_sameで同じ型かどうかを判定する。
declspecで式から型を得る。
invoke_resultで関数の戻り値の型を得る。

ソース:https://github.com/ambiesoft/blogprogs/tree/master/5775/static_assert_type_check

emplace_backでムーブコンストラクタがあるのにコピーコンストラクタが呼ばれる

puch_backよりもemplace_backがいいと言われていて実験したら、push_backだとコピーコンストラクタが呼ばれないのに、emplace_backだと呼ばれる現象が発生。

結論

ムーブコンストラクタにnoexceptをつければコピーコンストラクタの代わりにムーブコンストラクタが呼ばれる。

ソース:https://github.com/ambiesoft/blogprogs/tree/master/5767

C++/CLIのBeginInvoke

BeginInvokeはInvokeと違って、非同期でデリゲートを呼び出します。別スレッドで実行されるので注意が必要です。待ったりするときはIAsyncResultを使います。

なおここで紹介しているBeginInvokeはControl::BeginInvokeとは違うものなので注意が必要です。

最もシンプル

引数を渡す

2つの引数を渡す

コールバックを設定してコールしてもらう

コールバック関数に値を渡す

クラスの関数で

2つのBeginInvokeを同時に待つ

ソースコード

https://github.com/ambiesoft/blogprogs/tree/master/5753

std::vectorのソート

enable_if

enable_ifによりある条件のときだけtemplateを有効にすることができる。逆に言うとtemplateにしたくない条件を無効化することができる。

std::enable_if_t<std::is_convertible_v<T, int>>std::enable_if<std::is_convertible<T, int>::value>::type>と同じことなのでこれについて考える。

全体としての意味はTintに変換できるときだけテンプレートを有効にするということ。

is_convertible<T, int>Tintに変換できるかを判定し、その結果はvalueに格納される。

enable_if<A>Atrueかどうかを判定し、trueならばtypeに型voidを格納する。falseならエラーになる。

よって全体としてTintに変換できない場合はエラーになり、templateのインスタンス化は行われない(コンパイルエラーにはならない(SFINAE))。

この例ではどういうときにこれを使うのかの応用例は示せていないが、特定の型のときだけテンプレートを有効にしたい場合に使う。

typename = としているのはtypename A = などと同じでデフォルトのテンプレート引数の指定、これはテンプレートのインスタンス化をするかどうかだけのために使われるので、コード中では使われないのでこういう記述になっている。

Windowsでプロセスで共有する変数を定義する

sharedセクションをつかう

以下のコードで変数iをプロセスで共有できる。すべてのプロセスがなくなると消える。

プロジェクトは以下を参照
https://github.com/ambiesoft/blogprogs/tree/master/5637

stringのvectorをスペースで区切って1つのstringにする


TLTR

ostringstreamとは

<<で渡された値を内部に持っているstringに追加していく。

ostream_iteratorとは

=で渡された値をコンストラクタで渡された出力ストリームに追加していく。
コンストラクタの2番めの引数はデリミタを指定する。=でストリームに追加したあとにこの値も追加する。デフォルトでは何も追加しない。
++演算では何もしない。これにより下記のcopyで役に立つ。

上のコードは以下のようにコンソールに出力される。

copyとは

第一引数と第二引数のイテレータで入力範囲を指定する。
第三引数で出力イテレータを指定する。

入力出力とも++で一個ずつずらしていって=でコピーする。

ostream_iteratorの++は何もしないで=で値をストリームに追加する。(最初のコード参照)