MSVCRT std::for eachのソースを表示
新しいページはコチラ
移動:
案内
,
検索
[[Windows#MSVC Runtimeリファレンス|MSVC Runtimeリファレンス]]に戻る =='''概要'''== for_each関数は引数の第1から引数の第2までのIterator(要素番号)による管理がされているobject全てに対して引数3の関数を実行する関数です。引数3の関数は通常ラムダ式を使って、第一引数の値から複数の実行コマンドと戻り値を記載します。引数1から引数2までのobjectは関数の引数として第3引数の関数の引数として受け取ることが出来ます。ラムダ式で記述する場合は[]()->(){}の手前の()内で引数を引数の第1~第2引数の型と対応が取れる必要があります。[]の中に書くキャプチャ(for_eachの外で使っていた変数を受け取る部分) ->() の()内で指定するのが、戻り値の型と変数名、{}内には、関数そのもの、要するにプログラムを記述します。 例えば、以下のように定義して使います。 <span style = "background:linear-gradient(transparent 75%, #ffbf7f 75%); font-weight:bold; "><span style="color:blue;">std::for_each</span>(</span><br /> <span style = "background:linear-gradient(transparent 75%, #ffbf7f 75%); font-weight:bold; "><span style="color:deeppink;">Iterator型で要素番号を管理するクラスを使った関数適用の始まりの要素</span>, </span><br /> <span style = "background:linear-gradient(transparent 75%, #ffbf7f 75%); font-weight:bold; "><span style="color:deeppink;">Iterator型で要素番号を管理するクラスを使った関数適用の終わりの要素</span>, </span><br /> <span style = "background:linear-gradient(transparent 75%, #ffbf7f 75%); font-weight:bold; "><span style="color:deeppink;">各要素番号に対して実行する関数(ラムダ式)</span></span><br /> <span style = "background:linear-gradient(transparent 75%, #ffbf7f 75%); font-weight:bold; ">);</span> 例 <span style = "background:linear-gradient(transparent 75%, #cab8d9 75%); font-weight:bold; "><span style="color:blue;">std::for_each</span>(argvUTF16, argvUTF16 + argcUTF16, </span><br /> <span style = "background:linear-gradient(transparent 75%, #cab8d9 75%); font-weight:bold; ">[&argvUTF8Q](<span style="color:deeppink;">const auto&</span> arg) { </span><br /> <span style = "background:linear-gradient(transparent 75%, #cab8d9 75%); font-weight:bold; ">argvUTF8Q<span style="color:blue;">.emplace_back</span>(<span style="color:blue;">QString::fromUtf16</span>(<span style="color:deeppink;">reinterpret_cast<const char16_t*></span>arg, -1)<span style="color:blue;">.toUtf8</span>());</span><br /> <span style = "background:linear-gradient(transparent 75%, #cab8d9 75%); font-weight:bold; ">}</span><br /> <span style = "background:linear-gradient(transparent 75%, #cab8d9 75%); font-weight:bold; ">);</span> LPWSTR* argvUTF16がw_char型の先頭アドレスを保持していて、例えばargcUTF16(4Byte文字)の要素数の2を足すと(4Byte*2個)8byte(32bit)分アドレスが進んだところまで繰り返す感じです。例えば、argvUTF16に要素が1つだけならば、要素2はNULLになる感じで組み込まれるでしょう。 ということなので、for_eachで関数を繰り返し実行するようにプログラムはされていますが、要素数が2で、文字列が格納されている要素数が1であれば、単純にQByteArrayテンプレート化されているvector型argvUTF8Qの最後尾に付け足す処理が実行されます。このとき、argvUTF8Qあとで、使いたいのでfor_each内だけのオブジェクトでは活用できません。外からの引数としてラムダ式の [] 内に記述してある必要があります。そして、argにはLPWSTR* argvUTF16のアドレスが渡されconst char* argはキャストされてQString::fromUtf16静的メンバ関数を利用して、UTF-16にエンコードされます。さらにfromUtf16(xxx).toUtf8という記述であるため、UTF-16になった文字列が、UTF-8に変換された値がemplace_backの引数となるため、結局はargvUTF16から取り出された引数のargがUTF-8になってargvUTF8QというQByteArray型にテンプレート化されたvector型の値として、UTF-8形式の文字列を最後尾に持つようになります。 ややこしかったかな? for_eachの動作が分かってもらえたかなと思っています。さらには文字列配列ポインタに整数を1byte分の整数値を足せば次の要素にいけるということです。charは4byteなので2個足すと8byte先に移動します。これは32bitなので、配列で言うと1つ分です。そういうアドレスの型への整数の足し算の仕組みを理解していれば、理解はできると思います。[[Cpp ラムダ式]]はリンク先でも簡単に説明しています。サンプルプログラムを書くとか言っておきながらさぼってますけど。 [[Windows#MSVC Runtimeリファレンス|MSVC Runtimeリファレンス]]に戻る
MSVCRT std::for each
に戻る。
個人用ツール
ログイン
名前空間
ページ
議論
変種
表示
閲覧
ソースを表示
履歴表示
操作
検索
案内
メインページ
コミュニティ・ポータル
最近の出来事
最近の更新
おまかせ表示
ヘルプ
ツールボックス
リンク元
関連ページの更新状況
特別ページ