<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>はらぺこ日誌 &#187; C++</title>
	<atom:link href="https://blog.harapeko.jp/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.harapeko.jp</link>
	<description>株式会社はらぺこ 公式ブログ</description>
	<lastBuildDate>Mon, 30 Oct 2017 14:32:56 +0000</lastBuildDate>
	<language>ja</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.9.2</generator>
	<item>
		<title>C++11用のクラスひな形生成スクリプトを作ってみた</title>
		<link>https://blog.harapeko.jp/2014/08/20/cppgen/</link>
		<comments>https://blog.harapeko.jp/2014/08/20/cppgen/#comments</comments>
		<pubDate>Wed, 20 Aug 2014 08:10:44 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[C++11]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[ツール]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=357</guid>
		<description><![CDATA[C++ で開発する上で、クラスを一つ一つ実装するたびに毎回同じようなことを書かされるのは冗長なので、だいたいこ [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>C++ で開発する上で、クラスを一つ一つ実装するたびに毎回同じようなことを書かされるのは冗長なので、だいたいこんな感じになるよねという範囲のひな形を生成するスクリプトを perl で記述してみました。</p>
<ul>
<li><a href="https://github.com/murachi/samples-for-blog/tree/master/perl/cppgen">cppgen.pl</a></li>
</ul>
<p><a href="http://search.cpan.org/~asw/Getopt-Compact-0.04/lib/Getopt/Compact.pm">Getopt::Compact</a> モジュールを使用しています。ご利用の際にはそちらも合わせてインストールしてあげてください。<br />
<span id="more-357"></span><br />
ツールの特徴としては以下のとおりです。</p>
<ul>
<li>名前空間とクラス名を指定すると、それらから類推される名前でファイル名や include guard シンボル名を設定し、ひな形を生成する。これらの指定は必須。
<ul>
<li>名前空間は 1階層にしか対応してません…。</li>
</ul>
</li>
<li>doxygen フォーマット (javadoc 風) でコメントを付加。
<ul>
<li>-s オプションでクラスの概要 (<code>@brief</code>) を指定可能。省略した場合はクラス名を使用。</li>
</ul>
</li>
<li>クラスの public 継承、仮想クラス、インタフェースクラスに対応。</li>
<li>Pimpl に対応 (構造体及びメンバ変数名は固定です…)。</li>
<li>Boost.noncopyable に対応。</li>
<li>コピーコンストラクタ、ムーブコンストラクタを自力実装するようにプレースホルダを設ける機能に対応。</li>
</ul>
<p>使い方ですが、例えば以下のようにすると、</p>
<pre>
$ perl cppgen.pl -c Observer -d hoge -s 'オブザーバーインタフェース' -in
$ perl cppgen.pl -c Subject -d hoge -s 'サブジェクト抽象クラス' -vpn
$ perl cppgen.pl -c ConsoleView -d hoge -s 'コンソールビュー抽象クラス' -e Subject -p
$ perl cppgen.pl -c StaticText -d hoge -s 'コンソールに静的にテキストを表示するビュークラス' -e ConsoleView -p
$ perl cppgen.pl -c DateTime -d hoge -s '日時を扱うクラス' -pCM
$ perl cppgen.pl -c WatchController -d hoge -s '時計コントローラ' -e Observer -p
$ perl cppgen.pl -c ConsoleManager -d hoge -s 'コンソール操作管理クラス' -pn
$ ls
console-manager.cpp  console-view.h  date-time.h      static-text.h  watch-controller.cpp
console-manager.h    cppgen.pl       observer.h       subject.cpp    watch-controller.h
console-view.cpp     date-time.cpp   static-text.cpp  subject.h
</pre>
<p>以下のような構成でファイルが生成されます。</p>
<ul>
<li>Observer クラス &#8230; noncopyable なインタフェースクラス (observer.h のみ)</li>
<li>Subject クラス &#8230; Pimpl を持つ noncopyable な抽象クラス (subject.h, subject.cpp)</li>
<li>ConsoleView クラス &#8230; Subject を継承し、 Pimpl を持つ抽象クラス (console-view.h, console-view.cpp)
<ul>
<li>他のクラスを継承するクラスは強制的に抽象クラスになります (デストラクタが virtual になる)。当たり前ですが…。</li>
</ul>
</li>
<li>StaticText クラス &#8230; ConsoleView クラスを継承し、 Pimpl を持つ抽象クラス (static-text.h, static-text.cpp)</li>
<li>DateTime クラス &#8230; Pimpl を持ち、コピーコンストラクタ、ムーブコンストラクタのプレースホルダを持つクラス (date-time.h, date-time.cpp)</li>
<li>WatchController クラス &#8230; Observer クラスを継承し、 Pimpl を持つ抽象クラス (watch-controller.h, watch-controller.cpp)</li>
<li>ConsoleManager クラス &#8230; Pimpl を持つ noncopyable なクラス (console-manager.h, console-manager.cpp)</li>
</ul>
<p>詳しくは <code>-h</code> オプションでヘルプを見るか、ソースを参照してください <tt>(^_^;</tt> 。</p>
<hr />
2014/8/22 &#8211; <strong>追記</strong><br />
テンプレートクラスに対応しました。</p>
<pre>
$ perl gencpp.pl -c DomNodeFromId -d hoge <strong style="color: red;">-t 'class NodeType'</strong> -ns 'ID を指定して DOM ノードを検索するラッパーオブジェクトクラス'
</pre>
<p>とかやると、以下の内容のヘッダファイル dom-node-from-id.h のみが生成されます。</p>
<pre>
/**
    @file   dom-node-from-id.h
    @brief  ID を指定して DOM ノードを検索するラッパーオブジェクトクラス定義  
*/
#ifndef HOGE_DOM_NODE_FROM_ID_H
#define HOGE_DOM_NODE_FROM_ID_H


namespace hoge {

/**
    @brief  ID を指定して DOM ノードを検索するラッパーオブジェクトクラス  
*/
template <strong style="color: red;">&lt;class NodeType&gt;</strong>
class DomNodeFromId {
    /// コピーコンストラクタ (使用禁止)
    DomNodeFromId(DomNodeFromId const&amp;) = delete;
    /// コピー代入演算子 (使用禁止)
    DomNodeFromId &amp; operator=(DomNodeFromId const&amp;) = delete;
    /// ムーブコンストラクタ (使用禁止)
    DomNodeFromId(DomNodeFromId &amp;&amp;) = delete;
    /// ムーブ代入演算子 (使用禁止)
    DomNodeFromId &amp; operator=(DomNodeFromId &amp;&amp;) = delete;

public:
    /**
        @brief  デフォルトコンストラクタ  
    */
    DomNodeFromId()
    {
        //TODO: デフォルト生成を行う処理の詳細をここに記述
    }
    /**
        @brief  デストラクタ  
    */
    ~DomNodeFromId() = default;
};

}   //namespace hoge

#endif  //HOGE_DOM_NODE_FROM_ID_H
</pre>
<p>見ての通り、 -n オプションと併用すると Boost.noncopyable を使用する代わりに、コピーやらムーブやらのあれこれを <code>= delete</code> しまくるコードが挿入されます。それから、デフォルトコンストラクタのプレースホルダはクラス定義内に確保され、デストラクタは <code>= default</code> で定義されます。</p>
<p>この他、 -CM オプションあたりが併用可能となっていますが、抽象クラスになるようなオプション (-vie) や、 Pimpl モード (-p) との併用はできません。</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2014/08/20/cppgen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Observer パターンでコンソール MVC っぽいことをやってみる &#8211; C++ のための API デザイン</title>
		<link>https://blog.harapeko.jp/2014/08/06/observer-apides/</link>
		<comments>https://blog.harapeko.jp/2014/08/06/observer-apides/#comments</comments>
		<pubDate>Wed, 06 Aug 2014 09:06:45 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[Boost]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[C++11]]></category>
		<category><![CDATA[設計]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=319</guid>
		<description><![CDATA[ライブラリ API の設計手法を学ぼうシリーズの第2弾です。前回の記事はこちら。以下の教材を利用しています。  [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>ライブラリ API の設計手法を学ぼうシリーズの第2弾です。<a href="http://blog.harapeko.jp/2014/06/19/pimpl-factory-apides/">前回の記事はこちら</a>。以下の教材を利用しています。</p>
<ul>
<li><a href ='http://www.amazon.co.jp/gp/search/ref=as_li_qf_sp_sr_il?ie=UTF8&#038;camp=247&#038;creative=1211&#038;index=aps&#038;keywords=C%2B%2B%20API%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3&#038;linkCode=as2&#038;tag=harapekoinc-22'>C++ APIデザイン<br />
<img src='http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&#038;ASIN=B00EYXMA6Q&#038;Format=_SL250_&#038;ID=AsinImage&#038;MarketPlace=JP&#038;ServiceVersion=20070822&#038;WS=1&#038;tag=harapekoinc-22' border='0' /></a></li>
</ul>
<p>さて、API のラッピングパターンについてはざっと読むだけで終了とし、今回は Observer パターンについてさらってみました。</p>
<h3>MVC っぽいことをやってみたい。</h3>
<p>本書では、オブザーバーパターンの説明に入る前に、 MVC アーキテクチャについての説明がありました。</p>
<blockquote cite="http://www.amazon.co.jp/gp/search/ref=as_li_qf_sp_sr_il?ie=UTF8&#038;camp=247&#038;creative=1211&#038;index=aps&#038;keywords=C%2B%2B%20API%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3&#038;linkCode=as2&#038;tag=harapekoinc-22" title="C++ APIデザイン - 3.5.1 モデル/ビュー/コントローラ (p.120)"><p>
シンプルなアプリケーションでは、コントローラはユーザ入力に基づいてモデルへの変更に影響を与え、こうした変更をビューに通信して、UIを更新できるようにする。しかし、実際のアプリケーションでは、通常、水面下のモデルへの追加変更を反映するために、ビューも更新する必要がある。(…中略…)とはいえ、先ほど述べたように、モデルコードはビューコードを静的にバインディングして呼び出すことはできない。そこでオブザーバーが必要になるのだ。
</p></blockquote>
<p>なるほどなるほど。とまぁ、こんな説明の後に Observer パターンの実装例とその説明に入っていくのを見せられたら、そりゃあまぁ、 MVC っぽいことをやってみたい、って普通思いますよね…??</p>
<p>ただ、上記にあるようにモデルがビューを監視できるようにする必要があるという話であるにもかかわらず、多くの MVC フレームワーク実装を見るに、ビューからのメッセージを受け取って何らかの制御を行うコードは通常コントローラに書かれているように見えます。現実的には、ビジネスロジックはフレームワークを差し替えても流用可能であることが望ましく、オブザーバーにするための抽象クラスの継承でさえ避けたいというのが実情なのではないかと思います。<br />
<span id="more-319"></span><br />
そこで、コントローラをビューに対するオブザーバーとする設計とし、ビューが提供するいくつかのメッセージに対して、メッセージハンドラのような感じでコントローラを登録し、実装できるようにする、という考え方でやってみることにしました。ビューはよく使いそうなパターンのものを幾つか用意しておけば、あとは必要に応じてたまーに新しいものを追加する程度の変更で事足りるでしょうが、コントローラは新しい機能を追加するたびに必ず実装を追加することになります。テキスト p.120 の図にも示されている通り、ビューはコントローラの実装を知らないほうが良いのです。モデルはコントローラが掴んで (もしくは生成して)、ビューから呼び出されるハンドラメソッド内で操作するようにすればよいでしょう。</p>
<h3>コンソール画面で動くものを作ってみる。</h3>
<p>MVC アーキテクチャっぽいものを、といっても、具体的に何を作ろうか、というのは悩みどころです。 GUI のものを作るにしても、 Web アプリケーションを作るにしても、結構大掛かりなシステムになってしまうのではないかという不安があります。お試しで作るんですから、簡単なものがいいんですよね…。</p>
<p>というわけで、コンソール画面で動くものを作ることにしよう、ということでプログラムを書いてみることにしました。それも内容的にもごく簡単なものをということで、お題はズバリ、<strong>時計</strong>です。コンソール画面の真ん中らへんで、現在時刻を表示し続けるというだけの、ごくごく簡単なプログラムです。</p>
<h3>作ってみた。</h3>
<p>そんなわけで、作ってみました。ソースコードは以下の場所にて公開しています。</p>
<ul>
<li><a href="https://github.com/murachi/samples-for-blog/tree/master/c%2B%2B/api-design-for-c%2B%2B/ch03-pattern/observer">samples-for-blog/c++/api-design-for-c++/ch03-pattern/observer at master · murachi/samples-for-blog</a></li>
</ul>
<p>このプログラムは <code>std::thread</code> を使ったマルチスレッドプログラムなので、 gcc でコンパイルするときは以下のように、必ず <code>-pthread</code> オプションを付けてあげて下さい。</p>
<pre>
$ g++ -std=c++11 -pthread -o watch *.cpp
$ ./watch
</pre>
<p>プログラムを実行すると、コンソール画面がクリアーされて、画面の真ん中らへんに現在日時がリアルタイムで表示されます。また、画面の下の方に「Hit any key to finish.」と表示されるとおり、なにか適当なキーを押すとプログラムは終了します。<br />
<a href="http://blog.harapeko.jp/wp-content/uploads/2014/08/fig-run-ubuntu.png"><img src="http://blog.harapeko.jp/wp-content/uploads/2014/08/fig-run-ubuntu.png" alt="Ubuntu で実行" title="observer パターン練習プログラムを Ubuntu 環境で実行してみたところ" width="410" height="303" class="alignnone size-full wp-image-334" /></a><br />
<a href="http://blog.harapeko.jp/wp-content/uploads/2014/08/fig-run-windows.png"><img src="http://blog.harapeko.jp/wp-content/uploads/2014/08/fig-run-windows.png" alt="Windows で実行" title="observer パターン練習プログラムを Windows 環境で実行してみたところ" width="338" height="246" class="alignnone size-full wp-image-338" /></a><br />
なお、動作確認は以下の環境にて行いました。</p>
<ul>
<li>Ubuntu Linux 14.04 LTS x86_64/GCC 4.8.2/bash 4.3.11/kernel 3.13.0</li>
<li>Windows7 Professional SP1 x86_64/Mingw_w64 GCC 4.8.2 (powerd by <a href="http://win-builds.org/">Win-builds</a>)/コマンドプロンプト</li>
</ul>
<h3>プログラムの解説など。</h3>
<h4>モデル</h4>
<p>日時の保持と現在日時への更新、といった辺りをビジネスロジックとして実装しています。 datetime.h と datetime.cpp がそれです。</p>
<p>ここはまぁ、日時の取り扱いに Boost.DateTime を使っているという点以外は特筆すべき点も無いんじゃないかと思います。</p>
<h4>ビュー</h4>
<p>コンソール上で動作するビュー全般、ということで console-view.h と console-view.cpp 、より具体的に静的に文字列を表示するだけのビューということで static-text.h と static-text.cpp を、そしてキー入力を待ち受けるためのビューとして key-listener.h と keylistener.cpp を実装しました。また、ビューはオブザーバーを登録して通知を投げるサブジェクトとして実装しています (subject.h 、 subject.cpp)。</p>
<pre>
class SubjectBase : private boost::noncopyable {
    // ...
};

class ConsoleView : public SubjectBase {
    // ...
};

class StaticText : public ConsoleView {
    // ...
};

class KeyListener : public ConsoleView {
    // ...
};
</pre>
<p>SubjectBase クラスについては、これはもう概ね教科書どおりの実装です。 <code>subscribe()</code> メソッドにてメッセージ ID を指定しつつ observer を登録し、何らかのイベントに応じて、そのイベントに対応するメッセージ ID に指定登録されたすべてのオブザーバーに通知を投げる、ということができる仕組みになっています。派生クラスは自身の <code>notifyObserver()</code> メソッドを呼べば、 observer として登録されているコントローラを呼び出すことができるというわけです。</p>
<p>なお、オブザーバーの登録・削除はスレッドセーフになるよう、 Mutex を使ってロックをかけています。オブザーバーへの通知の際にもロックをかけていますが、通知対象となるオブザーバーの配列をコピーするまででロックを解除し、コピーを見て通知を行うようにしています (通知の実行までロックした状態でやるとデッドロックを起こすことがあったので…<tt>^^;</tt>)。</p>
<p>ConsoleView クラスはコンソール上で動作するビューとしての一通りの機能を持つクラス… であるべきなのですが、考えられるすべての機能を盛り込みまくる動機付けもなかったので、とりあえず以下の機能だけ実装しました。</p>
<ul>
<li>以下のステータスの保持と、それに基づく表示
<ul>
<li>表示文字列</li>
<li>表示位置 (コンソール座標)</li>
<li>色番号 (0～7)</li>
</ul>
</li>
<li>上記のステータスを変更すると、それに応じて表示を更新する</li>
<li>タイマー、およびインターバルタイマー</li>
<li>コンソール画面のサイズの取得</li>
</ul>
<p>ステータスの変更は <code>setStatus()</code> メソッドにて行います。ステータスを変更すると即座に表示に反映される、ようにしたかったのですが、例えばテキストも表示位置も色も変更するよ、という場合に、それぞれの値を個別に受け取るようにメソッドを分けてしまうと、一度の変更で再描画が最大 3回も走ってしまう、というのでは激しくダサいなと思ったので、現在のステータスを構造体として受け取って、その内容を書き換えるコールバック関数を受け取るようにしてあります。このコールバック関数は <code>std::function</code> として受け取るようにしてあるので、キャプチャ付きのラムダを指定することも可能です (<a href="http://blog.harapeko.jp/2014/07/25/lambda-ref-captured-constant/" title="はらぺこ日誌» ブログアーカイブ » C++: lambda の参照キャプチャは const 性を損なわない?">こちらの記事</a>でやろうとしていたやつですね<tt>^^;</tt>)。</p>
<p>タイマーとインターバルタイマーは、それぞれ <code>setTimer()</code> と <code>setInterval()</code> 各メソッドを呼ぶことで発動します。どちらも指定した時間が来ると <code>vm_Timer</code> メッセージの通知を observer に投げます。インターバルタイマーの方はこれを <code>stopInterval()</code> を呼ぶまで何度でも繰り返します。今回のプログラムではインターバルタイマーの方だけ使っています。</p>
<p>StaticText クラスはコンソール上の固定の位置に、指定した色で指定したテキストをただ表示するだけのビューとして実装しました。 <code>changeText()</code> メソッドを使うことで、表示するテキストの内容だけ変更することができるようになっています。もっとも、<code>ConsoleView::setStatus()</code> メソッドが public なので、やろうと思えば表示位置や色も変更できてしまうのですが…。</p>
<p>KeyListener クラスは、キー入力を待ち受けし、入力値を取得することができる入力用のビューです。あまりコメントを尽くしていないのでわかりにくいのですが、 <code>initialize()</code> メソッドをオーバーライドしており、オブザーバーに初期化メッセージを投げる前に、この中でキー待受を行うスレッドを生成します。このスレッドがキーの入力を取得すると、今度はオブザーバーにそのことを伝えるメッセージを投げ、オブザーバー側で <code>getKeyChar()</code> メソッドを呼んで入力値を得ることができるようになっています。</p>
<h4>コンソールマネージャ</h4>
<p>コンソール制御は複数存在しうるビューとは切り離して実装する必要があると判断し、コンソールマネージャとして別途実装しています (console-manager.h 、 console-manager.cpp)。内容的にはシングルトンにしたいところなのですが、今回はビューに対して依存性を注入することを前提とした設計ということにしてみました (<code>main()</code> 関数の中で 1つだけインスタンスを生成するイメージ)。</p>
<p>実際に実装した機能は以下のとおりです。</p>
<ul>
<li>インスタンス生成時に画面をクリアする。</li>
<li>インスタンス破棄時にカーソルの現在の文字の色を元に戻す (Windows では白で決め打ちにしちゃってます…)。</li>
<li>コンソール画面のサイズの取得 (<code>getSize()</code>)。</li>
<li>指定したカーソル位置及び色でコンソールに文字列を出力する (<code>output()</code>)。</li>
<li>エコーバックせずにキー入力を受け付ける (<code>waitKeyInput()</code>)。</li>
</ul>
<p>ConsoleView クラスやその派生クラスが提供する機能の具体的な実装は全てここにあります。</p>
<p>最後の <code>waitKeyInput()</code> は、要するに DOS の <code>getch()</code> 関数です (実際、 Windows では <a href="http://msdn.microsoft.com/ja-jp/library/078sfkak.aspx">_getch()</a> 関数を呼んでいます)。当然ブロックします (なので、 KeyListener クラスはスレッドを咬ましてこいつを呼びに行っています)。</p>
<h4>コントローラ</h4>
<p>時計のリアルタイム表示処理を行うコントローラとして watch-controller.h と watch-controller.cpp 、キーが入力されるまでプログラムを実行させ続けるためのコントローラとして wait-controller.h と wait-controller.cpp を実装しました。これらはサブジェクトであるビューから通知を受け取るオブザーバーとして実装しています (observer.h)。</p>
<pre>
class ObserverBase : private boost::noncopyable {
public:
    virtual ~ObserverBase() = default;
    virtual void notify(int message) = 0;
};

class WatchController : public ObserverBase {
    // ...
};

class WaitController : public ObserverBase {
    // ...
};
</pre>
<p>ObserverBase クラスも SubjectBase クラスと同様、教科書通りの実装となっております。通知を受け取る純粋仮想関数 <code>notify()</code> があるだけの簡単なインタフェースです。</p>
<p>WatchController クラスは時計のリアルタイム表示処理を行います。コンストラクタに StaticText インスタンスの参照を受け取り、コンストラクタの中で初期化メッセージとインターバルタイマメッセージ用に自身を登録します。で、初期化メッセージを受け取ったタイミングで StaticText のインターバルタイマ (これは ConsoleView から継承されている機能ですね) を開始し、インターバルタイマメッセージを受け取ったタイミングで、自身がメンバに持つ DateTime オブジェクトの現在時刻更新を行いつつ、 StaticText の表示に反映させる、という仕組みです。</p>
<p>WaitController クラスはキー入力を受け取るまでひたすら待ち続けるという処理を行います。 WatchController だけだと、 インスタンスを生成したはいいけど main 関数が処理から抜けてしまってプログラムがあっという間に終わっちゃうという物悲しい現象が起こってしまうので、何もしないでただ待つだけのスレッドを用意してそれに同期 (join) することで main 関数から抜けないようにして上げる必要があり、その役目を果たすのがこのクラスというわけです。</p>
<p>作りは WatchController に割と似通っていまして、まずコンストラクタに KeyListener インスタンスの参照を受け取り、コンストラクタの中で初期化メッセージとキー入力メッセージ用に自身を登録します。で、初期化メッセージを受け取ったタイミングでコンソールに「Hit any key to finish.」などと表示しつつ、フラグが立つまでひたすら待ち続けるだけのスレッドを作って join します (このため、 <code>KeyListener::initialize()</code> メソッドの呼び出し元がブロックされる)。その直前に KeyListener が生成していたキー入力待ち受けスレッドがキー入力を受け付け、そのメッセージをこのコントローラに投げると、そこで先ほど処理をブロックするためだけに作ったスレッドを終了させるフラグを立て、めでたくブロックされていた処理が開通する、という仕組みです。</p>
<p>両方のコントローラで共通する話なのですが、ビューへのオブザーバー登録はどちらもオブザーバーであるコントローラのコンストラクタの中で行っています。 WatchController での記述を以下に示しますが、</p>
<pre>
WatchController::WatchController(StaticText &amp; text_view)
    : impl{new WatchController::Impl{text_view}}
{
    text_view.subscribe(ConsoleView::vm_Init,
        std::shared_ptr&lt;ObserverBase&gt;{this, [](ObserverBase *){}});
    text_view.subscribe(ConsoleView::vm_Timer,
        std::shared_ptr&lt;ObserverBase&gt;{this, [](ObserverBase *){}});
}
</pre>
<p><code>std::shared_ptr</code> のコンストラクタの第2引数に何もしないラムダを渡すというなんだか気持ちの悪いことをやっていますよね。何でこんなことをやっているのか。サブジェクト側ではオブザーバーインスタンスを shared_ptr でメモリー管理していますが、これはサブジェクトがどのように生成されるかわからないという前提では妥当な設計だと思うのですが、その一方で実際に登録を行うときに、これをオブザーバーのコンストラクタの中でやってしまおう、そうした方がなんだかスマートに書けそうだという場合に、 <code>this</code> ポインタをそのまま shared_ptr に包んでしまうのは非常に危険です。なぜならそのオブザーバーインスタンスはどのように生成されるかわからないし、生成した側がどのような形で管理するかもわからないので、例えばスタック変数として生成した場合や、生成した側でも unique_ptr や shared_ptr に包んで適切に破棄しようとしていた場合には、どちらかの破棄のタイミングで例外が送出される (おそらくは、アプリケーションエラーになる) ことになってしまいます。そうならないように、何もしない deleter を shared_ptr に渡し、 <code>delete</code> が呼ばれるのを防いでいるわけです。メモリーの管理責任の所在については色々と議論もあるでしょうが、私はインスタンスの生成を行った側が、そのインスタンスの破棄についても責任をもつべきだと考えています。</p>
<h4>main関数</h4>
<p>main関数はわかりやすいように main.cpp ファイルに記述しました。まず ConsoleManager インスタンスを生成し、次に日時の表示を行うビュー StaticText とコントローラ WatchController を生成して、ビューの <code>initialize()</code> メソッドを呼ぶ。同様にキー入力待受を行うビュー KeyListener とコントローラ WaitController を生成して、同じくビューの <code>initialize()</code> メソッドを呼ぶ。ただこれだけです。これだけで何でよしなに動いてくれるのか、といった辺りは、ここまでで色々と説明したとおりです… (分かんないかなぁ<tt>^^;</tt>)。</p>
<h3>作ってみた感想など</h3>
<p>前回 Pimpl をさらった時に、テキストに示されていた以外にプラットフォーム依存のコードを各状況というのがなかなか思いつかなくて try 出来なかったのですが、今回 ConsoleManager という形で <code>#ifdef</code> 書きまくることが出来たのはちょっと幸運でした。こういうのは自分で書いてみないと、他人が書いたコードを読むだけではなんだかビビってしまうばかりなので… プラットフォームごとに違うことをやるようなコードを書いて、どっちのプラットフォームでも動くのを確認するのはなかなか爽快ですよ。</p>
<p>KeyListener みたいな仕組みは、本当はビューではなく全く別の枠組みで用意すべきだったのかもしれません。 Windows のメッセージループみたいに書けるのが本当は理想的… なのかなぁ?? (よくわからん)</p>
<p>Windows の方は実際一応動くのですが、キー入力時に時々よく分からんエラーを吐いて終わることがあります (2014/8/6 時点)。何かがツメが甘いのかも…。</p>
<p>より MVC フレームワークチックにやりたいということであれば、他にも色々と改良の余地はあるんじゃないかと思います。埋め込みリソースからビューを生成とか…。</p>
<p>こちらからは以上です。</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2014/08/06/observer-apides/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>shared_ptr にヒープ以外のものを掴ませたいなら何もしない Deleter も一緒に指定してあげればいい</title>
		<link>https://blog.harapeko.jp/2014/07/27/shared_ptr-nop-deleter/</link>
		<comments>https://blog.harapeko.jp/2014/07/27/shared_ptr-nop-deleter/#comments</comments>
		<pubDate>Sun, 27 Jul 2014 06:57:15 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[C++11]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=314</guid>
		<description><![CDATA[これまた非常に初歩的な話なのですが… STL のコンテナ (std::vector とか) には基本的にオブジ [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>これまた非常に初歩的な話なのですが…</p>
<ul>
<li>STL のコンテナ (<code>std::vector</code> とか) には基本的にオブジェクトへの参照を掴ませることはできない (領域確保の効率の問題とかでデフォルトコンストラクタが必須だから)。</li>
<li>かといって、ナマポを掴ませるのは色々と危険 (意図せず寿命が切れて無効なポインタ掴まされた状態になったりとか)。</li>
<li>そも non-copyable なオブジェクトを扱いたかったりと言った理由で値そのものを掴ませるのは却下したい (まぁ、いろいろあるんだよ…)。</li>
<li>となると <code>std::shared_ptr</code> を噛ますのが順当かと思いきや…</li>
<li>必ずしもヒープに確保した (つまり、 new した) インスタンスだけを扱うとは限らないかもしれない。十分に寿命が長いことがわかっている自動変数やメンバ変数として確保したインスタンスのポインタをこのコンテナに突っ込んであげたい場合もあるかもしれない。</li>
<li>そういう場合に <code>std::shared_ptr</code> 使っちゃって大丈夫なのか…??</li>
</ul>
<p><span id="more-314"></span></p>
<h3>Deleter を指定してあげれば大丈夫</h3>
<ul>
<li><a href="https://github.com/murachi/samples-for-blog/tree/master/c%2B%2B/minimal-cases/shared-pointer-deleter">今回のサンプルコード</a></li>
</ul>
<p><code>std::shared_ptr</code> の Deleter って、 Win32 の <code>HANDLE</code> みたいに <code>delete</code> 以外の方法で開放するリソースを扱う方法として紹介されることが多いと思うんだけど、単純に、リソース開放の責任はここにはないよ、ということを明示する方法としてももちろん使えるよという、ただそれだけの話なんですね。</p>
<pre>
#include &lt;memory&gt;
#include &lt;vector&gt;
#include &lt;iostream&gt;

class Hoge {
    int number;
public:
    explicit Hoge(int num) : number{num}
    { std::cout &lt;&lt; &quot;Hoge &quot; &lt;&lt; number &lt;&lt; &quot; constructed.&quot; &lt;&lt; std::endl; }
    ~Hoge() { std::cout &lt;&lt; &quot;Hoge &quot; &lt;&lt; number &lt;&lt; &quot; destructed.&quot; &lt;&lt; std::endl; }
};

int main()
{
    std::vector&lt;std::shared_ptr&lt;Hoge&gt;&gt; hogehoge;
    hogehoge.push_back(std::shared_ptr&lt;Hoge&gt;{new Hoge(1)});    // まぁ普通…
    Hoge fuga{2};
    hogehoge.push_back(std::shared_ptr&lt;Hoge&gt;{&amp;fuga, [](Hoge *){}});    // を、行けるやん!!
    Hoge piyo{3};
    hogehoge.push_back(std::shared_ptr&lt;Hoge&gt;{&amp;piyo});    //(アカン)

    return 0;
}
</pre>
<p>実行結果:</p>
<pre>
murachi@erueru:~/github/samples-for-blog/c++/minimal-cases/shared-pointer-deleter$ g++ -std=c++11 -o hoge hoge.cpp
murachi@erueru:~/github/samples-for-blog/c++/minimal-cases/shared-pointer-deleter$ ./hoge
Hoge 1 constructed.
Hoge 2 constructed.
Hoge 3 constructed.
Hoge 3 destructed.
Hoge 2 destructed.
Hoge 1 destructed.
Hoge 3 destructed.
*** Error in `./hoge': double free or corruption (out): 0x00007fff8a6192a0 ***
中止 (コアダンプ)
murachi@erueru:~/github/samples-for-blog/c++/minimal-cases/shared-pointer-deleter$ 
</pre>
<p>何もしない Deleter を指定しなかった場合、 <code>std::vector</code> が開放される際に <code>std::shared_ptr</code> が <code>delete</code> を呼ぼうとするんだけど、出自が自動変数だった当該インスタンスはスコープ抜けるときに vector より先に破棄されちゃっていたので、結果コアダンプしてしまうわけですが、 Deleter を指定してあげた方は <code>std::vector</code> 開放時には何もしないので、結果開放処理が重複することなく済むわけです。 Deleter が lambda で書けちゃうのもいいですね。</p>
<p>ただ、この方法は<strong> <code>std::shared_ptr</code> でメモリー管理する領域よりも、生成元での寿命のほうが確実に長いことがわかっている場合以外は使えません</strong>。そういう意味では、プログラマーがメモリーの管理責任から開放されるための仕組みとして <code>std::shared_ptr</code> やガーベジコレクションのようなものを採用していることとは矛盾するやり方だと言えるでしょう。基本的には、 <code>std::shared_ptr</code> で扱うべきものは、プログラム全体で <code>std::shared_ptr</code> を介してのみ扱うよう徹底するのが正しいやり方なのかもしれません。</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2014/07/27/shared_ptr-nop-deleter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C++: lambda の参照キャプチャは const 性を損なわない?</title>
		<link>https://blog.harapeko.jp/2014/07/25/lambda-ref-captured-constant/</link>
		<comments>https://blog.harapeko.jp/2014/07/25/lambda-ref-captured-constant/#comments</comments>
		<pubDate>Fri, 25 Jul 2014 07:40:24 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[C++11]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=309</guid>
		<description><![CDATA[C++ の勉強ということでちょいちょいスモールケースを書いては意味もなく github に commit する [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>C++ の勉強ということでちょいちょいスモールケースを書いては意味もなく github に commit するということをやっているのですが…</p>
<ul>
<li><a href="https://github.com/murachi/samples-for-blog/tree/master/c%2B%2B/minimal-cases/value-modifier-lambda">samples-for-blog/c++/minimal-cases/value-modifier-lambda at master · murachi/samples-for-blog</a></li>
</ul>
<p>んー、何でしょうねこの雑なコード<tt>(^_^;A</tt> これ自体は確か、ステータスの変化を検知してステータスの種類にかかわらず共通の処理を自動で走らせるようにしたいんだけど、そうするとあれとこれとそれを変更しようとした時にあれを変更した時にもこれを変更した時にもそれを変更した時にも処理が重複して走っちゃうから無駄だよねってケースを想定して、じゃあ今あるステータスを全部一時的な構造体に突っ込んだものを引数にとってその構造体に変更を加えて返すコールバックを引数に取るようにすればいいんじゃね? って思ったんだけど、そんなの lambda で書きたいに決まってるけど変数キャプチャ付きの lambda は関数ポインタに変換できないじゃんねっていう訳で、コールバックに関数ポインタじゃなくて lambda を受け取る template メソッドにしてしまえ、ということを試してみたくて書いていたものでした (今考えたらそも<strong>素直に <code>std::function</code> 使えよ…</strong>って話ですねorz)。<br />
<span id="more-309"></span><br />
で、その試み自体は割とどうでもよくて、そういえば lambda の変数キャプチャで指定できるのはコピーか参照かのどっちかだけだけど、元々のキャプチャされる変数が <code>const</code> だった場合に、参照キャプチャしちゃった先の lambda の中で const 性が失われる (つまり、値の書き換えができちゃう) なんてことはないのかなぁ、というのがちょっと気になりました。</p>
<blockquote cite="https://github.com/murachi/samples-for-blog/blob/master/c%2B%2B/minimal-cases/value-modifier-lambda/main.cpp" title="main.cpp より引用">
<pre>
struct A {
    void func(minimum::Data &amp;data, std::string const&amp; birth, std::string const&amp; company)
    {
        data.modify([&amp;birth, &amp;company](minimum::Data::Detail detail){
            detail.keys.erase(detail.keys.begin() + 1);
            auto role = detail.values[1];
            detail.values.erase(detail.values.begin() + 1);
            detail.keys.push_back(&quot;birth&quot;);
            // birth = &quot;書き換えちゃった^-^&quot;;    //エラー
            detail.values.push_back(birth);
            detail.keys.push_back(&quot;company&quot;);
            detail.values.push_back(company);
            return detail;
        });
    }
};
</pre>
</blockquote>
<p>上記コードで <code>birth</code> は <code>std::string const&#038;</code> 型の引数として宣言されており、それを lambda で参照キャプチャし lambda 内で変更しようとすると、コンパイルエラーになる、ということが<strong>手元の GCC 4.8.2 では</strong>確認されました (-std=c++11)。</p>
<p>…いや、ここで <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf">N3337</a> でも参照して規格のこの部分の記述からしてそうなるのが正しいようですとか言い切れればカッコイイんですけど、少なくとも lambda について説明のあった 5.1.2節からはそんな記述を読み取ることはおいらには出来まへんでした… orz 。このへんもうちょっと読み慣れることができればいいんですけどね…。</p>
<hr />
2014/7/25 21:46 &#8211; <strong>追記</strong></p>
<p><a href="https://github.com/murachi/samples-for-blog/tree/master/c%2B%2B/minimal-cases/value-modifier-function"><code>std::function</code> を使って改良</a>してみました。うわー、こっちのほうが全然スマートじゃないですかヤダー</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2014/07/25/lambda-ref-captured-constant/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pimpl とかファクトリとか &#8211; C++ のための API デザイン</title>
		<link>https://blog.harapeko.jp/2014/06/19/pimpl-factory-apides/</link>
		<comments>https://blog.harapeko.jp/2014/06/19/pimpl-factory-apides/#comments</comments>
		<pubDate>Thu, 19 Jun 2014 05:53:55 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[活動記録]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[C++11]]></category>
		<category><![CDATA[設計]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=304</guid>
		<description><![CDATA[otoco プロジェクトの開発に着手するにあたって、私はまだ C++ でのライブラリ開発を 1 からコーディネ [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="http://developer.harapeko.jp/trac/original/otoco">otoco プロジェクト</a>の開発に着手するにあたって、私はまだ C++ でのライブラリ開発を 1 からコーディネートした経験がなかったので、クロスプラットフォームに対応したライブラリ API の開発手法を学ぶ必要があると感じました。ちょうどいい感じの教材が割りと最近出ていたようで、早速購入し、勉強を進めています。</p>
<ul>
<li><a href ='http://www.amazon.co.jp/gp/search/ref=as_li_qf_sp_sr_il?ie=UTF8&#038;camp=247&#038;creative=1211&#038;index=aps&#038;keywords=C%2B%2B%20API%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3&#038;linkCode=as2&#038;tag=harapekoinc-22'>C++ APIデザイン<br />
<img src='http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&#038;ASIN=B00EYXMA6Q&#038;Format=_SL250_&#038;ID=AsinImage&#038;MarketPlace=JP&#038;ServiceVersion=20070822&#038;WS=1&#038;tag=harapekoinc-22' border='0' /></a></li>
</ul>
<p>C++11 についても若干触れられているようで (原著執筆当時はまだ C++0x と呼ばれていた模様…)、この手の教材の中では比較的情報が新しい方なんではないかと思われます。</p>
<p>実はこの本を買って勉強し始めたのはもう結構前 (確か前原にいた頃… 昨年の暮れ頃?) なのですが、ここしばらく本業やら引っ越しやらが忙しくてなかなか手を回せずにいたので、久しぶりの着手ということで、すでに履修していた第3章の、 Pimpl イディオムとファクトリメソッド辺りを復習してみました。<br />
<span id="more-304"></span><br />
今度こそ本腰を入れてちゃんとやろう、ということで、<a href="https://github.com/murachi/samples-for-blog/tree/master/c%2B%2B/api-design-for-c%2B%2B" title="samples-for-blog/c++/api-design-for-c++ at master · murachi/samples-for-blog">練習用に書いたサンプルプログラムは github に up しております</a>。 git の練習も兼ねているのですが…。</p>
<h3>Pimpl イディオム</h3>
<p>C++ でライブラリを実装するのに際して最も基本的とも言うべきテクニックです。 2章の中で、優れた API の特徴について議論されていますが、その中でも Pimpl イディオムは、プラットフォーム独立性を高める働きと、結合度を削減する働きを担っています。本書のサンプルではタイマーを取り上げ、 Unix の getTimeOfDay(2) システムコールと Win32 の <code>GetTickCount()</code> API の両方に対応する場合に、 Pimpl イディオムを用いて実装の詳細をヘッダーファイルから <code>.cpp</code> ファイルへ隠すというものでした。</p>
<ul>
<li><a href="https://github.com/murachi/samples-for-blog/tree/master/c%2B%2B/api-design-for-c%2B%2B/ch03-pattern/pimpl" title="samples-for-blog/c++/api-design-for-c++/ch03-pattern/pimpl at master · murachi/samples-for-blog">Pimpl イディオムのサンプルプログラム</a></li>
</ul>
<p>私が書いたサンプルもほぼ同内容です (メインルーチンはお馴染みの? あほプログラムでやんす)。強いて違いを言えば、 Pimpl を <code>std::unique_ptr</code> に突っ込んでいること (本書では <code>boost::scoped_ptr</code> を採用していました) ぐらいでしょうか。</p>
<h3>ファクトリメソッド</h3>
<p>本書では Pimpl イディオムの次にシングルトンパターンを解説していますが、今回はここは一旦飛ばして (書かれていることは有用なので、目を通すことはおすすめします)、ファクトリメソッドの方をさらってみました。</p>
<p>本書で紹介されているファクトリメソッドは、 GoF のファクトリメソッドパターンとは若干異なるようで、 Creator の継承と Product の継承を連動させて云々、というものではなく、単に値による指定で生成するオブジェクトの種類を切り替えるという類のもののようでした。これはこれで、例えばプラグインの実装なんかでは役に立ちそうなテクニックだとは思います。</p>
<ul>
<li><a href="https://github.com/murachi/samples-for-blog/tree/master/c%2B%2B/api-design-for-c%2B%2B/ch03-pattern/factory" title="samples-for-blog/c++/api-design-for-c++/ch03-pattern/factory at master · murachi/samples-for-blog">ファクトリメソッドのサンプルプログラム</a></li>
</ul>
<p>拡張可能なファクトリの応用として、ファクトリ登録を生成されるオブジェクトのクラス毎に行うようにし、 Product の追加が行いやすいような設計にしてみました。この用途に限れば登録解除は不要だろうということで、登録用のメソッドのみ用意。ファクトリ名とコールバックの保存には、グローバル変数<strong>ではなく</strong>、関数内 <code>static</code> 変数として用意した <code>std::unordered_map</code> に格納することで、コンパイル単位をまたいだ非ローカル静的オブジェクトの初期化順に伴うSEGVりを回避しています (この辺のことはそれこそ本書のシングルトンの項にて、 Scott Meyers の言葉を引用しつつ説明されています)。</p>
<p>また、せっかくなので極力 Pimpl を用いるようにしてみました。プラットフォーム独立性も重要ですが、それを考慮する必要のない場面でも、 <code>private</code> メソッドの追加・変更に伴う再コンパイルを気にする必要がなくなることによるメンテナンス性の向上 (修正・改変・リファクタリングのやりやすさ) は非常に重要です。今回作った中では、特に <code>Base64Converter</code> クラスの実装がまぁまぁいいサンプルになったんじゃないかと思います (…<code>Base64Map</code>クラスも <code>.cpp</code> ファイルの中に隠しちゃってもよかったかもなぁ…)。</p>
<p>今回はここまで。次回があれば、今度はラッピングパターン、オブザーバーパターンあたりをさらえればと思います。</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2014/06/19/pimpl-factory-apides/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Boost.勉強会 #14 に行ってきました</title>
		<link>https://blog.harapeko.jp/2014/03/04/boost-study-1/</link>
		<comments>https://blog.harapeko.jp/2014/03/04/boost-study-1/#comments</comments>
		<pubDate>Tue, 04 Mar 2014 04:36:38 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[活動記録]]></category>
		<category><![CDATA[Boost]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[講習会]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=300</guid>
		<description><![CDATA[Boost.勉強会 #14 東京 &#8211; boostjp ヲレが書いたメモ というわけで boostj [&#8230;]]]></description>
				<content:encoded><![CDATA[<ul>
<li><a href="https://sites.google.com/site/boostjp/study_meeting/study14">Boost.勉強会 #14 東京 &#8211; boostjp</a></li>
<li><a href="http://developer.harapeko.jp/trac/original/ideanote/wiki/HowTo/BoostStudy14" title="HowTo/BoostStudy14 – Idea note">ヲレが書いたメモ</a>
</ul>
<p>というわけで boostjp 書記担当(?)の @T_MURACHI でございます。ご報告遅れましたが、 3/1 に開催された Boost.勉強会 #14 に行ってきました。過去ログ見る限り #4 以来なので 3年ぶりですか…。なんかもうそろそろコンパイラ的に C++11 使えるのも当たり前になってきて当時に比べてもだいぶいい時代になったなぁとか思ってみたり (M$ 除く)。</p>
<p>内容についてはメモに書いた以上のことを語り尽くせる自信がないので、以下、感想などを思いつきで綴ってみます…。</p>
<ul>
<li>並列処理に関連する話題を取り上げた話が多かったように思います。トレンドというよりは、プロセッサなどのハードの進化の方向がもう完全にこっちに移行していっているが故の必然、といった感じなんですかね。GPGPU に関して言えば応用カテゴリはまだまだ限られている模様ですが…。</li>
<li>cpprefjp の github 連携のための涙ぐましい… という程でもないとは思うんですが^^;、Google Sites なんて使い始めちゃったのが運の尽きっちゃあ運の尽きだったのかなぁとは… でも用意されたものにうまいこと順応できるよう対応する能力ってのはこのギョーカイで仕事やってる上で絶対重宝されると思うので、そういう意味でも良い経験をされたんじゃないかなと思います。
<ul>
<li>ていうか @melponn さんかわいい。</li>
</ul>
</li>
<li>聴衆の食付きは glfw3 を使った GUI フレームワークの話が一番良かったように思います。なんだかんだ言ってみんなビジュアルグリグリ動かす系好きなんだなぁと…。 @hira_kuni_45 さん経験豊富そうで尊敬します… OpenGL 大好きで GCC 大好きで Unix ライクなのの方が好きそうなのにメインの開発環境が MinGW て… なんか某 R 社 (コピー機とか作ってる方) で働いてた時もそういう感じの方結構いらっさったような…</li>
<li>その他、グラフアルゴリズムの話とか、 C# でやってることを C++ で実装したら…の話とか、どれも非常に興味深いお話でした。面白かった。</li>
<li>会場には<a href="http://cpplover.blogspot.jp/" title="本の虫">江添さん</a>もいらっさってましたね。ドワンゴステッカー配り始めたところで確信しましたが… 思ってたよりもなんだかずっと元気なちっさいオッサンって感じでした^^;。 @cpp_akira さんと C++WG の主査がどうのこうのとかで話をしていて平行線を辿ったりとかしていたのを見るにつけ、 C++ 標準化界隈も一枚岩じゃないんだなぁとか思ってみたり…</li>
</ul>
<p>そんなこんなで、割とぶっ通しの 8時間。流石に疲れました…。参加された皆様も本当にお疲れ様でした。</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2014/03/04/boost-study-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>DataTable から値を引っ張る方法あれこれ</title>
		<link>https://blog.harapeko.jp/2013/06/10/csharp-downcast/</link>
		<comments>https://blog.harapeko.jp/2013/06/10/csharp-downcast/#comments</comments>
		<pubDate>Sun, 09 Jun 2013 21:42:05 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=287</guid>
		<description><![CDATA[C# で DB を扱う場合などで、よく DataTable を使うことになると思うのですが、こいつから値を取り [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>C# で DB を扱う場合などで、よく DataTable を使うことになると思うのですが、こいつから値を取り出すときの書き方が人によって結構まちまちだな、と思うことが結構あるので、ちょっとおさらいしてみることにします。</p>
<p>今回は割と初歩的な内容になります。あと、記事中のコードはテストしてないので動作を保証できません。<br />
<span id="more-287"></span></p>
<h3>方法1. 普通にキャストする</h3>
<pre>
DataTable table = view.Select();
foreach (var row in table)
{
    var seq = (int)row["HOGE_CD"];
    var name = (string)row["HOGE_NAME"];

    var remark = row["HOGE_REMARK"].GetType() == typeof(string) ?
        (string)row["HOGE_REMARK"] : null;

    // 処理 ...

}
</pre>
<p>NULL を許容するフィールドについては型チェックを行う必要がある、というのがポイントになります。 NULL 値は <code>null</code> ではなく <code><a href="http://msdn.microsoft.com/ja-jp/library/system.dbnull.aspx">DBNull</a>.Value</code> として入ってくるので、そのままキャストしようとすると <code><a href="http://msdn.microsoft.com/ja-jp/library/system.invalidcastexception.aspx">InvalidCastException 例外</a></code> が送出される場合があるからです。</p>
<h3>方法2. <code>as</code> 演算子を使う</h3>
<pre>
DataTable table = view.Select();
foreach (var row in table)
{
    var seq = row["HOGE_CD"] as int?;
    var name = row["HOGE_NAME"] as string;
    var remark = row["HOGE_REMARK"] as string;

    // 処理 ...

}
</pre>
<p><a href="http://msdn.microsoft.com/ja-jp/library/vstudio/cscsdfbt.aspx"><code>as</code> 演算子</a>は、型キャストが可能ならばキャストを行い、不可能な場合は <code>null</code> を返すという、最近ありがちなフレームワークでの頻繁に down cast を要求するような実装においては非常に便利な演算子です。 C++ で言うところの <code>dynamic_cast</code> 演算子に似ています (なので、個人的にはなるべく避けたい、頼り切りたくない概念なのですが…)。</p>
<p>普通に型キャストを行う方法に比べると、 NULL 許容フィールドに対しても同じように書けるため、非常にすっきりします。しかし、 <code>int</code> のような据え置き型などの、 <code>null</code> を許容しない型 (.NET では<a href="http://msdn.microsoft.com/ja-jp/library/vstudio/zcx1eb1e.aspx#Structures">構造体</a>と呼ばれているもの) に対して使うことは出来ません。その為、 <code>int</code> 型の値を取得する際には、指定する型を <code>int?</code> 型としているのがポイントです。これは、以下のように書くのと同じ意味になります。</p>
<pre>
    var seq = row["HOGE_CD"] as <a href="http://msdn.microsoft.com/ja-jp/library/b3h38hb0.aspx">Nullable</a>&lt;int&gt;;
</pre>
<p><code>Nullable&lt;T&gt;</code> 構造体は <code>null</code> を許容する特殊な構造体という位置づけで、通常の値型の値と同じように四則演算や比較演算を行うことも出来たりします。但し、元の値型が要求される場面ではそのまま渡すことは出来ないので、 <code>null</code> チェックをしてから <code>Value</code> プロパティを使う必要があります。</p>
<pre>
    if (seq.HasValue)   // null ではないことを確認
        MyMethod(seq.Value, name, remark);
    else
    {
        // nul だった場合の処理 ...
    }
</pre>
<h3>方法3. <code>object.ToString()</code> メソッドを使う</h3>
<p><a href="http://msdn.microsoft.com/ja-jp/library/system.dbnull.tostring.aspx" title="DBNull.ToString メソッド (System)"><code>DBNull.ToString()</code> が常に <code>string.Empty</code> を返す</a>ことを逆手にとり、元の値の型に関係なく手当たり次第に <code>ToString()</code> を呼んでしまえという考え方もあったりします。そのまま文字列で出力することの多い ASP.NET での開発などでは割とよく見かける手法です。</p>
<pre>
DataTable table = view.Select();
foreach (var row in table)
{
    var seq = row["HOGE_CD"].ToString();
    var name = row["HOGE_NAME"].ToString();
    var remark = row["HOGE_REMARK"].ToString();

    // 処理 ...

}
</pre>
<p>数値が入るフィールドの値をそのまま文字列として出力したいようなケースでは便利です。但し、 <code>DateTime</code> 型のように、そのまま <code>ToString()</code> してしまうと必ずしも期待した通りの表示にならないものもあるので、注意が必要です。</p>
<p>文字列型のフィールドの場合、単に出力する用途であれば <code>null</code> が許容されるケースが殆どなので (文字列連結演算でも <code>null</code> の混在は許容されています)、 <code>as</code> 演算子を用いる方法の方が適切かも知れません。そうでない場合は、それこそ NULL 値をチェックして分岐するようなコーディングが必要なことが殆どであるハズなので、やはり <code>as</code> 演算子を用いる方法の方が適切であるといえます。</p>
<h3>方法4. <code>object</code> 型のまま用いる</h3>
<p><code>ToString()</code> メソッドの利用にも通じるのですが、 例えば値の比較にのみ用いるので <code>object.Equal()</code> メソッドを呼べばいいか、みたいな使い方もあり得ます。</p>
<pre>
DataTable table = view.Select();
foreach (var row in table)
{
    // ...

    // 特定のステータスのレコードに対してのみ、何か特別な処理をさせたい場合など
    if (row["HOGE_STATUS"].Equal(MyConstant.HogeStatus.SpecialState))
    {
        // 処理...
    }
}
</pre>
<p>あるいは、そもそも <code>object</code> 型の値を要求するようなメソッドやプロパティに渡して用いるようなケースでは、わざわざ型キャストしてやる必要もないでしょう。 <code>StringBuilder</code> を用いて値を連結して使う場合なんかもそうですね。</p>
<h3>まとめ</h3>
<p>どの方法にもそれぞれ利点はあるので、ケースバイケースで使い分けると良いのではないかと思います。指針としてはこんな感じになるでしょうか。</p>
<table>
<tr>
<th>方法</th>
<th>コード例</th>
<th>有効な用途</th>
<th>注意点</th>
</tr>
<tr>
<td>普通に型キャスト</td>
<td>
      <code>var seq = (int)row["HOGE_CD"];</code><br />
      <code>var status = row["HOGE_STATUS"].GetType() == typeof(int) ? (int)row["HOGE_STATUS"] : -1;</code>
    </td>
<td>
      <code>null</code> を許容しない型の値を取り出して評価したい場合。<br />
      または NULL 値を許容しないフィールドであることが分かっている場合。
    </td>
<td>
      NULL 値が入ってくるフィールドの場合、NULL チェックを怠ると型キャストに失敗して例外が送出されることがある。
    </td>
</tr>
<tr>
<td><code>as</code> 演算子</td>
<td>
      <code>var seq = row["HOGE_CD"] as int?;</code><br />
      <code>var name = row["HOGE_NAME"] as string;</code>
    </td>
<td>
      この書き方が煩雑ではなく、 <code>Nullable&lt;T&gt;</code> 構造体を用いるのが嫌でなければ、多くのケースで適当。<br />
      <code>null</code> を許容する <code>string</code> 型の場合は特に有効。
    </td>
<td>
      <code>null</code> を許容しない <code>int</code> 型や <code>DateTime</code> 型などの値の場合には、 <code>Nullable&lt;T&gt;</code> 構造体を用いた型 (<code>int?</code> など) で値を扱う必要がある。
    </td>
</tr>
<tr>
<td><code>object.ToString()</code> メソッド</td>
<td>
      <code>hogeSeqNo_Label.Text = row["HOGE_SEQ"].ToString();</code>
    </td>
<td>
      とにかく文字列として扱いたい場合。
    </td>
<td>
    </td>
</tr>
<tr>
<td>そのまま <code>object</code> として扱う</td>
<td>
      <code>object.Equal()</code> メソッドを用いた値の比較。<br />
      <code>StringBuilder</code> の利用等、 <code>object</code> 型の引数が要求されるケース。
    </td>
<td>
      <code>object</code> 型のままで済む場合。
    </td>
<td>
    </td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2013/06/10/csharp-downcast/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>コンテナの種類は問わないが、要素の型は限定したい。</title>
		<link>https://blog.harapeko.jp/2012/09/27/type-traits/</link>
		<comments>https://blog.harapeko.jp/2012/09/27/type-traits/#comments</comments>
		<pubDate>Thu, 27 Sep 2012 06:15:10 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[C++0x]]></category>
		<category><![CDATA[C++11]]></category>
		<category><![CDATA[STL]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=257</guid>
		<description><![CDATA[C++ で STL などによる任意のコンテナを引数に取る関数を実装する際、そのコンテナの種類は問わないものの、 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>C++ で STL などによる任意のコンテナを引数に取る関数を実装する際、そのコンテナの種類は問わないものの、そのコンテナが持つ要素の型は限定したい、あるいは要素の型に応じて処理内容を切り替えたい、といったニーズがあると思います。</p>
<p>そのような場合、 C++11 であれば、 <a href="https://sites.google.com/site/cpprefjp/reference/type_traits" title="type_traits - cpprefjp - C++ Library Reference">&lt;type_traits&gt;</a> を利用します。</p>
<p>以下は、整数の型を要素に持つ任意のコンテナを受け取り、その全要素の合計を返す関数 <code>calcSum()</code> の実装例です。<br />
<span id="more-257"></span></p>
<pre>
#include &lt;iostream&gt;
#include &lt;type_traits&gt;
#include &lt;array&gt;
#include &lt;set&gt;

extern void * enabler;

template &lt;typename cont_t, typename value_type = typename cont_t::value_type,
    typename std::enable_if&lt;std::is_integral&lt;typename cont_t::value_type&gt;::value&gt;::type *&amp; = enabler&gt;
value_type calcSum(cont_t const&amp; container)
{
    value_type sum = 0;
    for (auto n : container)
        sum += n;
    return sum;
}

int main()
{
    std::array&lt;int, 5&gt; primes = { 2, 3, 5, 7, 11 };
    for (int i = 0; i &lt; primes.size(); i++)
        std::cout &lt;&lt; (i == 0 ? &quot;&quot; : &quot; + &quot;) &lt;&lt; primes[i];
    std::cout &lt;&lt; &quot; = &quot; &lt;&lt; calcSum(primes) &lt;&lt; std::endl;
    
    // std::array&lt;double, 5&gt; floating_nums = { 1.414, 1.732, 2.236, 2.718, 3.142 };
    // auto result = calcSum(floating_nums);    // エラー: そんな関数無いよ
    
    std::multiset&lt;short&gt; nums = { 152, 24, 73, -15, 250, 3, 24 };
    bool is_first = true;
    for (auto num : nums) {
        std::cout &lt;&lt; (is_first ? &quot;&quot; : &quot; + &quot;) &lt;&lt; num;
        is_first = false;
    }
    std::cout &lt;&lt; &quot; = &quot; &lt;&lt; calcSum(nums) &lt;&lt; std::endl;
    
    return 0;
}
</pre>
<p>実行結果は以下の通りです。</p>
<pre>
2 + 3 + 5 + 7 + 11 = 28
-15 + 3 + 24 + 24 + 73 + 152 + 250 = 511
</pre>
<p>Boost ライブラリを含む C++ 全般の話題を追い続けてきた人であれば当然ご存じの知識だと思います。ええ、そうです、今回は完全に自分用のメモです (汗。こういう書き方があること自体は認識していたのですが、いやー、やっぱり実際に使わないことには身につかないですね <tt>(^_^;A</tt> 。</p>
<p>基本的には、テンプレートの中で、制限したい通りの条件に適合する場合のみ <code>true</code> になるような定数式を <code>std::enable_if&lt;</code> ～ <code>&gt;</code> で括ってやり、そのクラスメンバである型 <code>type</code> を <code>typename</code> として評価する、というものです。この <code>std::enable_if&lt;foobar&gt;::type</code> は、 <code> foobar</code> が <code>true</code> になる場合のみ (テンプレートの特殊化によって) 定義されるような仕組みになっていて、これが <code>false</code> になってしまう (すなわち、あなたの指定したい条件に合致しない) 呼び出し方をしようとすると、単にオーバーロードできないケースとして無視されます。</p>
<p>上記のケースでは要素が整数型以外の場合はオーバーロード可能な関数が存在しないものとしてコンパイルエラーになりますが、別途浮動小数点用の実装や <code>std::complex&lt;T&gt;</code> 用の実装、さらには <code>std::string</code> 用の実装なんかも用意してあげることで、それぞれに独自の処理を実現させるということもできちゃう、という寸法です。便利。</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2012/09/27/type-traits/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>unorderd_map のキーに enum 型を使用する</title>
		<link>https://blog.harapeko.jp/2012/01/02/stl-enum-hash/</link>
		<comments>https://blog.harapeko.jp/2012/01/02/stl-enum-hash/#comments</comments>
		<pubDate>Sun, 01 Jan 2012 22:45:38 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[活動記録]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[C++0x]]></category>
		<category><![CDATA[C++11]]></category>
		<category><![CDATA[STL]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=235</guid>
		<description><![CDATA[新年明けましておめでとうございます。去年はちっとも儲からなかったので、今年は本腰入れて開発やって自力で稼げる事 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>新年明けましておめでとうございます。去年はちっとも儲からなかったので、今年は本腰入れて開発やって自力で稼げる事業を立ち上げたく、その準備を進めて参る所存でございます。どうぞ生暖かく見守っていただければと思います…。</p>
<p>さて、<a href="http://blog.harapeko.jp/2011/12/27/cpp11-unicode/">前回の記事</a>でお見せした、 iconv のラッパークラスをテンプレートクラスに作り直す際、 <code>&lt;unorderd_map&gt;</code> を利用していて気づいたことの備忘録です。</p>
<ul>
<li><a href="http://developer.harapeko.jp/trac/original/otoco/browser/trunk/sample/EncodeString.hpp?rev=16">EncodeString.hpp</a></li>
<li><a href="http://developer.harapeko.jp/trac/original/otoco/browser/trunk/sample/EncodeString.cpp?rev=16">EncodeString.cpp</a></li>
</ul>
<p><span id="more-235"></span></p>
<h3>問題</h3>
<p>テンプレート引数に、内部文字列の (アラインメントを決定する) 物理型と文字セットを指定できるようにしたかったのですが、文字セットを示す文字列そのものをテンプレート引数に渡すことはできないので、代わりに文字セットを表す列挙値を定義し、対応する「文字セットを表す文字列」と関連づけた連想配列を <code>&lt;unorderd_map&gt;</code> を用いて用意する、ということをやってみることにしました。 C/C++ の列挙値は <code>int</code> にキャスト可能なので昔の自分だったら単純に「文字セットを表す文字列」の配列を用意して添え字代わりに列挙値を突っ込むところですが、メンテナンス性良くないですし、ハッシュテーブルなら検索コストは (ほぼ) 変わらないですからね。</p>
<p>で、ヘッダファイルの方で列挙型を定義しーの、</p>
<pre>
enum charset_t {
    chset_Utf8, chset_C99, chset_Java,
    chset_Ucs2, chset_Ucs2Be, chset_Ucs2Le,
    chset_Ucs4, chset_Ucs4Be, chset_Ucs4Le,
    chset_Utf16, chset_Utf16Be, chset_Utf16Le,
    chset_Utf32, chset_Utf32Be, chset_Utf32Le,
    chset_Utf7,
    chset_EucJp, chset_EucJis0213,
    chset_Iso2022Jp, chset_Iso2022Jp2, chset_Iso2022Jp1, chset_Iso2022Jp3,
    chset_ShiftJis, chset_Cp932, chset_ShiftJisX0213,
};
</pre>
<p>テンプレート化しない実装部分のクラスに <code>static</code> で <code>const</code> な連想配列メンバを追加しーの、</p>
<pre>
class EncodeStringImpl
{
    typedef std::unordered_map&lt;charset_t, char const *&gt; cnmap_t;
    static cnmap_t const CharsetNames;

    // ...
};
</pre>
<p>実装ファイルの方で連想配列の値を定義しーの、</p>
<pre>
EncodeStringImpl::cnmap_t const EncodeStringImpl::CharsetNames = {
    { chset_Utf8, &quot;UTF-8&quot; }, { chset_C99, &quot;C99&quot; }, { chset_Java, &quot;JAVA&quot; },
    { chset_Ucs2, &quot;UCS-2&quot; }, { chset_Ucs2Be, &quot;UCS-2BE&quot; }, { chset_Ucs2Le, &quot;UCS-2LE&quot; },
    { chset_Ucs4, &quot;UCS-4&quot; }, { chset_Ucs4Be, &quot;UCS-4BE&quot; }, { chset_Ucs4Le, &quot;UCS-4LE&quot; },
    { chset_Utf16, &quot;UTF-16&quot; }, { chset_Utf16Be, &quot;UTF-16BE&quot; }, { chset_Utf16Le, &quot;UTF-16LE&quot; },
    { chset_Utf32, &quot;UTF-32&quot; }, { chset_Utf32Be, &quot;UTF-32BE&quot; }, { chset_Utf32Le, &quot;UTF-32LE&quot; },
    { chset_Utf7, &quot;UTF-7&quot; },
    { chset_EucJp, &quot;EUC-JP&quot; }, { chset_EucJis0213, &quot;EUC-JISX0213&quot; },
    { chset_Iso2022Jp, &quot;ISO-2022-JP&quot; }, { chset_Iso2022Jp2, &quot;ISO-2022-JP2&quot; },
    { chset_Iso2022Jp1, &quot;ISO-2022-JP1&quot; }, { chset_Iso2022Jp3, &quot;ISO-2022-JP3&quot; },
    { chset_ShiftJis, &quot;SHIFT_JIS&quot; }, { chset_Cp932, &quot;CP932&quot; }, { chset_ShiftJisX0213, &quot;SHIFT_JISX0213&quot; },
};
</pre>
<p>実際に使いーの、とやってみたはよいのですが、</p>
<pre>
void EncodeStringImpl::encode(void const *src, size_t src_length, size_t chr_size, charset_t from_charset,
    charset_t to_charset)
{

    // ...

    class auto_iconv_t {    // 生成時に iconv_open してスコープ抜ける時に iconv_close するプライベートクラス…
        const iconv_t impl;
    public:
        auto_iconv_t(charset_t from_cs, charset_t to_cs) :
            // ↓こことか
            impl(iconv_open(CharsetNames.find(to_cs)-&gt;second, CharsetNames.find(from_cs)-&gt;second))
        {
            if (impl == reinterpret_cast&lt;iconv_t&gt;(-1)) {
                // ↓こことか
                throw EncodeStringException(string(&quot;LIBICONV initialize error: please check character set name \&quot;&quot;) +
                    CharsetNames.find(from_cs)-&gt;second + &quot;\&quot;(from) or \&quot;&quot; + CharsetNames.find(to_cs)-&gt;second +
                    &quot;\&quot;(to)&quot;);
            }
        }
        ~auto_iconv_t() { iconv_close(impl); }
        iconv_t get() const { return impl; }
    } iconv_handle(from_charset, to_charset);
</pre>
<p>いざ <code>g++</code> してみると、「<q><code>std::hash&lt;charset_t&gt;::operator()(charset_t) const</code></q> なんて定義されてねーよ」とリンカ様に怒られてしまいました。</p>
<pre>
murachi@ubuntu-vbox:~/otoco/trunk/sample$ g++ -std=c++0x -o kumapan EncodeString.cpp kumapan.cpp 
/tmp/ccIn30PX.o: In function `std::__detail::_Hash_code_base&lt;charset_t, std::pair&lt;charset_t const, char const*&gt;, std::_Select1st&lt;std::pair&lt;charset_t const, char const*&gt; &gt;, std::equal_to&lt;charset_t&gt;, std::hash&lt;charset_t&gt;, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, false&gt;::_M_hash_code(charset_t const&amp;) const':
EncodeString.cpp:(.text._ZNKSt8__detail15_Hash_code_baseI9charset_tSt4pairIKS1_PKcESt10_Select1stIS6_ESt8equal_toIS1_ESt4hashIS1_ENS_18_Mod_range_hashingENS_20_Default_ranged_hashELb0EE12_M_hash_codeERS3_[std::__detail::_Hash_code_base&lt;charset_t, std::pair&lt;charset_t const, char const*&gt;, std::_Select1st&lt;std::pair&lt;charset_t const, char const*&gt; &gt;, std::equal_to&lt;charset_t&gt;, std::hash&lt;charset_t&gt;, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, false&gt;::_M_hash_code(charset_t const&amp;) const]+0x19): undefined reference to `std::hash&lt;charset_t&gt;::operator()(charset_t) const'
/tmp/ccIn30PX.o: In function `std::__detail::_Hash_code_base&lt;charset_t, std::pair&lt;charset_t const, char const*&gt;, std::_Select1st&lt;std::pair&lt;charset_t const, char const*&gt; &gt;, std::equal_to&lt;charset_t&gt;, std::hash&lt;charset_t&gt;, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, false&gt;::_M_bucket_index(std::__detail::_Hash_node&lt;std::pair&lt;charset_t const, char const*&gt;, false&gt; const*, unsigned int) const':
EncodeString.cpp:(.text._ZNKSt8__detail15_Hash_code_baseI9charset_tSt4pairIKS1_PKcESt10_Select1stIS6_ESt8equal_toIS1_ESt4hashIS1_ENS_18_Mod_range_hashingENS_20_Default_ranged_hashELb0EE15_M_bucket_indexEPKNS_10_Hash_nodeIS6_Lb0EEEj[std::__detail::_Hash_code_base&lt;charset_t, std::pair&lt;charset_t const, char const*&gt;, std::_Select1st&lt;std::pair&lt;charset_t const, char const*&gt; &gt;, std::equal_to&lt;charset_t&gt;, std::hash&lt;charset_t&gt;, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, false&gt;::_M_bucket_index(std::__detail::_Hash_node&lt;std::pair&lt;charset_t const, char const*&gt;, false&gt; const*, unsigned int) const]+0x28): undefined reference to `std::hash&lt;charset_t&gt;::operator()(charset_t) const'
collect2: ld はステータス 1 で終了しました
murachi@ubuntu-vbox:~/otoco/trunk/sample$ 
</pre>
<h3>解決策</h3>
<p>ヘッダーファイルの方で、以下の記述を列挙型の定義のすぐ後辺りに追加してやることで、リンクも通るようになります。テンプレートの特殊化ってやつですね。</p>
<pre>
namespace std {
template &lt;&gt;
    inline size_t
    hash&lt;charset_t&gt;::operator()(charset_t val) const
{
    return static_cast&lt;size_t&gt;(val);
}
}
</pre>
<h3>解説</h3>
<p><code>std::hash</code> テンプレートクラスの実装は、 libstdc++ の場合、ヘッダファイルが置かれる然るべきディレクトリ配下の <code>bits/functional_hash.h</code> に記述されています。ここでは、非ポインタ型 <code>T</code> に対する <code>operator()</code> は (宣言はされているものの) 定義されていません。</p>
<pre>
  /// Primary class template hash.
  template&lt;typename _Tp&gt;
    struct hash : public __hash_base&lt;size_t, _Tp&gt;
    {
      size_t
      operator()(_Tp __val) const;
    };

  /// Partial specializations for pointer types.
  template&lt;typename _Tp&gt;
    struct hash&lt;_Tp*&gt; : public __hash_base&lt;size_t, _Tp*&gt;
    {
      size_t
      operator()(_Tp* __p) const
      { return reinterpret_cast&lt;size_t&gt;(__p); }
    };
</pre>
<p>で、この <code>operator()</code> の実装は、ごくごく基本的な組み込み型に対してのみ特殊化されています (ここは流石に長くなるので引用しませんが…)。</p>
<p>こうした実装は C++11 の<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf" title="[PDF]JTC1.22.32 - ISO/IEC 14882 - Programming language C++ draft February 2011">ドラフト</a>にも明記されている標準の仕様に則ったものです。「20.8.12 Class template hash」に以下のような記述があります。</p>
<blockquote cite="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf" title="[PDF]JTC1.22.32 - ISO/IEC 14882 - Programming language C++ draft February 2011">
<ol>
<li>The unordered associative containers defined in 23.5 use specializations of the class template hash as the default hash function. For all object types Key for which there exists a specialization hash&lt;Key&gt;, the instantiation hash&lt;Key&gt; shall:
<ul>
<li>satisfy the Hash requirements (17.6.3.4), with Key as the function call argument type, the DefaultConstructible requirements (Table 19), the CopyAssignable requirements (Table 23),</li>
<li>be swappable (17.6.3.2) for lvalues,</li>
<li>provide two nested types result_type and argument_type which shall be synonyms for size_t and Key, respectively,</li>
<li>satisfy the requirement that if k1 == k2 is true, h(k1) == h(k2) is also true, where h is an object of type hash&lt;Key&gt; and k1 and k2 are objects of type Key.</li>
</ul>
<pre>
template &lt;&gt; struct hash&lt;bool&gt;;
template &lt;&gt; struct hash&lt;char&gt;;
template &lt;&gt; struct hash&lt;signed char&gt;;
template &lt;&gt; struct hash&lt;unsigned char&gt;;
template &lt;&gt; struct hash&lt;char16_t&gt;;
template &lt;&gt; struct hash&lt;char32_t&gt;;
template &lt;&gt; struct hash&lt;wchar_t&gt;;
template &lt;&gt; struct hash&lt;short&gt;;
template &lt;&gt; struct hash&lt;unsigned short&gt;;
template &lt;&gt; struct hash&lt;int&gt;;
template &lt;&gt; struct hash&lt;unsigned int&gt;;
template &lt;&gt; struct hash&lt;long&gt;;
template &lt;&gt; struct hash&lt;unsigned long&gt;;
template &lt;&gt; struct hash&lt;long long&gt;;
template &lt;&gt; struct hash&lt;unsigned long long&gt;;
template &lt;&gt; struct hash&lt;float&gt;;
template &lt;&gt; struct hash&lt;double&gt;;
template &lt;&gt; struct hash&lt;long double&gt;;
template &lt;class T&gt; struct hash&lt;T*&gt;;
</pre>
</li>
</ol>
</blockquote>
<p>そんな訳で、デフォルトで <code>std::hash</code> を利用する <code>std::unordered_map</code> を <code>enum</code> 型をキーにして使用したい場合には、その <code>enum</code> 型で <code>std::hash::operator()</code> を特殊化してあげる必要があるのです。</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2012/01/02/stl-enum-hash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C++11 で Unicode プログラミングのススメ</title>
		<link>https://blog.harapeko.jp/2011/12/27/cpp11-unicode/</link>
		<comments>https://blog.harapeko.jp/2011/12/27/cpp11-unicode/#comments</comments>
		<pubDate>Mon, 26 Dec 2011 16:33:41 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[Boost]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[C++0x]]></category>
		<category><![CDATA[C++11]]></category>
		<category><![CDATA[Unicode]]></category>
		<category><![CDATA[wchar_t]]></category>
		<category><![CDATA[文字セット]]></category>
		<category><![CDATA[文字列処理]]></category>
		<category><![CDATA[正規表現]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=229</guid>
		<description><![CDATA[このエントリは、C++11 Advent Calendar 2011 への参加記事です。 初心者表明を免罪符に [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>このエントリは、<a href="http://atnd.org/events/21936">C++11 Advent Calendar 2011</a> への参加記事です。</p>
<p>初心者表明を免罪符にするつもりは毛頭無いのですが、 C++0x/11 の学習、およびそれを用いた経験はまだまだ浅いため、内容的に拙い部分が多々あることを、あらかじめご容赦願いたいと思います <tt>m(_ _)m</tt> 。ていうか突っ込みだいかんげいでつ。</p>
<p>一応 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf">ISO/IEC 14882:2011 の draft &#8220;n3242&#8243;</a> を参照しています。 GCC は 4.7 入れるの面倒だったので、動作確認できるものについては Ubuntu 11.10 に入っていた 4.6.1 を用いています。</p>
<h3>Unicode に対応したリテラル</h3>
<p>文字リテラルについてはドラフトの 2.14.3、文字列リテラルについては 2.14.5 に記述があります。<br />
<span id="more-229"></span><br />
文字リテラルには従来の</p>
<pre>
'a'
L'あ'
</pre>
<p>といったスタイルに加えて、</p>
<pre>
u'\u00a9'   // コピーライト記号
U'\U0002000b'  // 丈の右上に点がついた字
</pre>
<p>といったスタイルが追加されました。想定されるべき対応関係を表にすると以下の通りになります。</p>
<table>
<tr>
<th>記述スタイル</th>
<th>文字セット</th>
<th>物理型</th>
</tr>
<tr>
<td><code>'</code>&#8230;<code>'</code></td>
<td>所謂 C 文字。<br />マルチバイトの 1 オクテットでもいいし、まぁ、何でもあり。</td>
<td><code>char</code></td>
</tr>
<tr>
<td><code>l'</code>&#8230;<code>'</code> または <code>L'</code>&#8230;<code>'</code></td>
<td>ユニバーサル文字セット (UCS)。</td>
<td><code>wchar_t</code></td>
</tr>
<tr>
<td><code>u'</code>&#8230;<code>'</code></td>
<td>UTF-16</td>
<td><code>char16_t</code></td>
</tr>
<tr>
<td><code>U'</code>&#8230;<code>'</code></td>
<td>UTF-32</td>
<td><code>char32_t</code></td>
</tr>
</table>
<p>文字列リテラルではさらに <code>u8</code> という接頭子も使えます。</p>
<pre>
u8"Copyright \u00a9 2011 Harapeko, Inc."    // \u00a9 は UTF-8 のオクテット列 [C2 A9] に変換される
u"\U0002000bは「丈」の字にクリソツ"         // \U0002000b は UTF-16 の該当するサロゲートペアに変換される…ハズ
</pre>
<p>対応関係の表は、…面倒くさいからもういいか。</p>
<p>あとさらっと流しちゃいましたが、 Unicode 用のエスケープ文字も追加されました。<q><code>\uNNNN</code></q> は 16bits の、 <q><code>\UNNNNNNNN</code></q> は 32bits の UCS を表現できます。上記の例のように、適切な文字列リテラル内で使用すれば、対応する文字セットの数値列に適宜変換されるはずです。この辺の説明はドラフトの 2.3 にありますが、以下の説明の通り、あくまで UCS の文字値を表現するものであって UTF の数値列を表現するものではないので、 <code>\uNNNN</code> の形式でサロゲートペアの上位代用符号位置に相当する値を指定することはできません。</p>
<blockquote cite="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf" title="Working Draft, Standard for Programming<br />
Language C++ (N3242=11-0012)"><p>
The character designated by the universal-character-name \UNNNNNNNN is that character whose character<br />
short name in ISO/IEC 10646 is NNNNNNNN; the character designated by the universal-character-name \uNNNN<br />
is that character whose character short name in ISO/IEC 10646 is 0000NNNN. If the hexadecimal value for a<br />
universal-character-name corresponds to a surrogate code point (in the range 0xD800.0xDFFF, inclusive),<br />
the program is ill-formed. Additionally, if the hexadecimal value for a universal-character-name outside the<br />
c-char-sequence, s-char-sequence, or r-char-sequence of a character or string literal corresponds to a control<br />
character (in either of the ranges 0&#215;00.0x1F or 0x7F.0x9F, both inclusive) or to a character in the basic<br />
source character set, the program is ill-formed.15
</p></blockquote>
<h3>Unicode に対応した物理型</h3>
<p>Unicode に対応した型については、ドラフトの 3.9.1 に説明があります。重要なのは多分以下の箇所。</p>
<blockquote cite="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf" title="Working Draft, Standard for Programming<br />
Language C++ (N3242=11-0012)">
<ol start="5">
<li>Type wchar_t is a distinct type whose values can represent distinct codes for all members of the largest<br />
extended character set specified among the supported locales (22.3.1). Type wchar_t shall have the same<br />
size, signedness, and alignment requirements (3.11) as one of the other integral types, called its underlying<br />
type. Types char16_t and char32_t denote distinct types with the same size, signedness, and alignment as<br />
uint_least16_t and uint_least32_t, respectively, in &lt;stdint.h&gt;, called the underlying types.</li>
</ol>
</blockquote>
<p>エーゴは苦手なんですが、ここを読む限り、<code>wchar_t</code> はサポートするロケールに含まれるもっとも大きな値の文字値を表現できるのに十分なサイズの整数型であることが補償されてなきゃいけなさそうに見えます。 <code>wchar_t</code> については<a href="http://blog.harapeko.jp/2009/07/25/wchar_t-suck/" title="はらぺこ日誌? ブログアーカイブ ? 頼りなさげな wchar_t">大分昔に見捨てている</a>んですが <tt>(^_^;</tt> 、VC++2010 だと 32bits 整数に変更されていたりするんでしょうか…?</p>
<p># <a href="http://msdn.microsoft.com/ja-jp/library/s3f49ktz.aspx" title="Data Type Ranges (MSDN)">この辺</a>とか見る限り、やっぱり <code>unsigned short int</code> 相当、のままみたいですね… orz</p>
<p><code>char16_t</code> と <code>char32_t</code> は、それぞれ UTF-16、 UTF-32 を扱うための型と考えて差し支えなさそうです。</p>
<h3>「内部文字」のポリシー</h3>
<p>型についての想定を考えるならば、プログラムが内部で扱う文字データは、 C++11 では <code>wchar_t</code> を使用するべきであるように思われます。将来的にはそうなってゆくべきなのでしょう。しかし過去との互換性などの観点から、各ベンダーの <code>wchar_t</code> に対する取り扱いは当面現状維持か、もしくは段階的な仕様変更 (コンパイラオプションでの切り替え等) となっていくことが予想されます。</p>
<p>それに対し、 UTF-32 に関して言えば、恐らく向こう十何年かぐらいは「1要素 = UCS 1文字」であり続けるのではないかと思われます。従って、内部文字への要件として「1文字を 1つの数値のみで扱いたい」というのがあるのであれば、当面は <code>char32_t</code> と <code>U"</code>&#8230;<code>"</code> 形式のリテラルを用いるのが良さそうです。</p>
<table>
<tr>
<th>要件</th>
<th>選択すべき型と文字セット</th>
</tr>
<tr>
<td>
<ul>
<li>1文字を 1つの数値のみで扱いたい</li>
<li>メモリー使用量は気にしないか、32bits 幅でも十分管理可能</li>
</ul>
</td>
<td><code>char32_t</code>、 UTF-32</td>
</tr>
<tr>
<td>
<ul>
<li><code>&lt;</code>(<code>boost/</code>)<code>regex&gt;</code> を使いたい (後述)</li>
<li>UTF-8 のクセに精通しているのでマルチバイトでも気にならない</li>
<li>メモリー使用量を極力抑えたい</li>
</ul>
</td>
<td><code>char</code>、 UTF-8</td>
</tr>
<tr>
<td>
<ul>
<li>とにかく <code>wchar_t</code> を使い慣れている</li>
<li>数十年後の未来との互換性、汎用性に賭けたい</li>
</ul>
</td>
<td><code>wchar_t</code>、 UCS</td>
</tr>
</table>
<h3>char32_t で文字列置換を試してみる</h3>
<p>そんなわけで、実際に UTF-32 を内部文字の文字セットとして採用したプログラム例を作ってみることにしました。内容的には、静的に用意した文字列内のすべての「くま」を「ぱんだ」に置き換える、という簡単なものです。</p>
<pre>
#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;string&gt;

using namespace std;

int main()
{
    u32string before = U&quot;てくまくまやこんてくまくまやこん むらやましゃちょうよ おおきなくまにな～ぁれ&quot;;
    u32string after;
    u32string kuma = U&quot;くま&quot;;
    u32string panda = U&quot;ぱんだ&quot;;

    auto start_it = before.begin();
    auto find_it = start_it + (kuma.size() - 1);
    while (find_it &lt; before.end()) {
        int cnt = 0;
        auto stop_it = find_if(kuma.rbegin(), kuma.rend(), [&amp;cnt, find_it](char32_t letter) {
            return *(find_it - cnt++) != letter;
        });
        if (stop_it != kuma.rend()) {
            find_it += cnt;
            continue;
        }
        // くまを発見、ぱんだに変身!!
        after.append(start_it, find_it - (kuma.size() - 1));
        after += panda;
        start_it = find_it + 1;
        find_it = start_it + (kuma.size() - 1);
    }
    after.append(start_it, find_it);

    cout &lt;&lt; &quot;before: &quot; &lt;&lt; before.size() &lt;&lt; endl;
    cout &lt;&lt; &quot;after: &quot; &lt;&lt; after.size() &lt;&lt; endl;

    return 0;
}
</pre>
<p>えっと… アルゴリズムの説明とかはいいですよね? 文字列の先頭からと検索語の後からで評価して、完全一致しなかった場合は一致した数値の数だけ読み飛ばして、を繰り返すというオーソドックスなやり方です。これだったらかっこつけて <code>find_if</code> とか使わんで <code>for</code> で回しても大して変わらんやんとかそういう突っ込みはさておき <tt>(^_^;</tt> 。</p>
<p>GCC4.6/Ubuntu での実行結果は以下の通り。</p>
<pre>
murachi@ubuntu-vbox:~/otoco/trunk/sample$ g++ -std=c++0x -o kumapan-n kumapan-n.cpp 
murachi@ubuntu-vbox:~/otoco/trunk/sample$ ./kumapan-n
before: 39
after: 44
murachi@ubuntu-vbox:~/otoco/trunk/sample$ 
</pre>
<p>実行結果として置換前後の <code>u32string::size()</code> を表示しています。 5つある「くま」が「ぱんだ」に置き換えられたので、その数が 5 増えています。増える筈の文字数と一致するので、正しく動作しているように見えます。</p>
<h3>iconv を使って実際に出力してみる</h3>
<p>さて、実際の文字列を出力してみたいのですが、このままだとロケールが UTF-8 で動作している端末上では表示できません。ファイルに出力してテキストエディタで、という手もありますが、せっかくなので libiconv を使って指定した文字セットに変換して出力、ということをやってみることにしましょう。</p>
<p>libiconv の利用に際しては、お手製のラッパークラスを作成することで対応しました。作成したソースコードを以下にリンクします。</p>
<ul>
<li><a href="http://developer.harapeko.jp/trac/original/otoco/browser/trunk/sample/EncodeString.hpp?rev=16">EncodeString.hpp</a></li>
<li><a href="http://developer.harapeko.jp/trac/original/otoco/browser/trunk/sample/EncodeString.cpp?rev=16">EncodeString.cpp</a></li>
</ul>
<p>このクラスは<a href="http://blog.harapeko.jp/2010/09/22/utf-8-is-nice/" title="はらぺこ日誌? ブログアーカイブ ? UTF-8 もイマイチだが…">過去の記事</a>においても使用しておりますが、 C++11 の勉強も兼ねて (?)、内部文字に使用する物理型と文字セットをテンプレートパラメータに指定できるテンプレートクラスに書き換えています (あ、過去の記事でのソースへのリンク先が最新版になっちゃってる…直さなきゃ…)。</p>
<p>そして先ほどのサンプルプログラムは、最初の方で <code>EncodeString.hpp</code> を <code>#include</code> し、</p>
<pre>
#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;string&gt;

#include &quot;EncodeString.hpp&quot; // ←

using namespace std;
</pre>
<p>最後の方で出力内容を以下のように修正します。</p>
<pre>
    cout &lt;&lt; &quot;before: &quot; &lt;&lt; EncodeString&lt;char32_t, chset_Utf32&gt;(before, chset_Utf8).getCharArray() &lt;&lt; endl;
    cout &lt;&lt; &quot;after: &quot; &lt;&lt; EncodeString&lt;char32_t, chset_Utf32&gt;(after, chset_Utf8).getCharArray() &lt;&lt; endl;
</pre>
<p>Windows 環境とかで Shift JIS (CP-932) で出力したい人は、 <code>chset_Utf8</code> を <code>chset_Cp932</code> に置き換えてあげれば ok です。GCC4.6/Ubuntu での実行結果は以下の通り。</p>
<pre>
murachi@ubuntu-vbox:~/otoco/trunk/sample$ g++ -std=c++0x -o kumapan EncodeString.cpp kumapan.cpp 
murachi@ubuntu-vbox:~/otoco/trunk/sample$ ./kumapan
before: てくまくまやこんてくまくまやこん むらやましゃちょうよ おおきなくまにな～ぁれ
after: てぱんだぱんだやこんてぱんだぱんだやこん むらやましゃちょうよ おおきなぱんだにな～ぁれ
murachi@ubuntu-vbox:~/otoco/trunk/sample$ 
</pre>
<p>環境によっては libiconv を別途導入してコンパイルオプションに <code>-liconv</code> を付け加える必要があるかもしれません (MinGW とか←動作未確認)。</p>
<h3>正規表現を使いたい</h3>
<p>さて、上記のサンプルでさらっと <code>u32string</code> とか使っちゃってますが、このシノニムはドラフトの 21.3 にてちゃんと明記された標準のものです。もちろん、 <code>u16string</code> というのも存在します (<code>u8string</code> は無いので、考慮されているのはアラインメントのみと考えるべきですが…)。</p>
<p>しかし、「28 Regular expressions library」の章においては、 <code>char32_t</code> という文字はカケラも hit しません。標準の <code>&lt;regex&gt;</code> においては、 <code>char16_t</code>、 <code>char32_t</code> への対応は見送られてしまっているようです。</p>
<p>もちろん、<code>basic_regex</code> はテンプレートクラスなのですから、自分でテンプレートパラメータを指定してあげればうまくいきそうに見えます。しかし、<a href="http://blog.harapeko.jp/2010/09/22/u32regex-bad-cast/" title="はらぺこ日誌? ブログアーカイブ ? char32_t だと regex が使えない">同様の試みを Boost.Regex について行った際には、 <code>std::bad_cast</code> 例外が送出されてプログラムがエラー終了してしまいました</a>。将来的には、あるいは処理系によってはうまく動かせる (ようになる) のかもしれませんが、あまり期待は持たない方が良いかもしれません…。</p>
<p># そもそも <a href="http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.200x" title="C++ 200x - Chapter 1. Status (libstdc++)">GCC (libstdc++) では <code>&lt;regex&gt;</code> 自体がまだちゃんと実装されてなかったり</a>… orz</p>
<p>もっとも、<a href="http://blog.harapeko.jp/2011/09/21/boostregex-icu-with-char32_t/" title="はらぺこ日誌? ブログアーカイブ ? Boost.Regex の ICU 拡張と char32_t は相性がいいかも?">Boost.Regex の ICU 拡張における <code>UChar32</code> と <code>char32_t</code> (およびそれらの配列へのポインタ) を無理矢理キャストして使うと割と上手く行くっぽかったりする</a>ので、どうにかこうにかラッパーを書いて当座はそれで凌ぐというのも手かもしれません…。</p>
<p>ちなみに、<code>char</code> と UTF-8 を使用するのであれば <code>&lt;regex&gt;</code> はそのまま使えるはずですが、その場合、 (Boost.Regex と同様に) <a href="http://blog.harapeko.jp/2010/09/22/utf-8-is-nice/" title="はらぺこ日誌? ブログアーカイブ ? UTF-8 もイマイチだが…"><code>&lt;regex&gt;</code> は UTF-8 を知らないので、マルチバイト特有の問題に悩まされることになる</a>でしょう。少なくとも日本語の文字に対する量指定子 (<q><code>あ+</code></q> とか <q><code>あ?</code></q> とか) は期待通りには動きません。</p>
<p>仮に、<code>&lt;regex&gt;</code> が <code>char32_t</code> で利用できる場合、先のサンプルは以下のようなコーディングになるでしょう。こういう風に組める日がいつか来るといいですね… <tt>(;_;)/</tt>。</p>
<pre>
#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;string&gt;
#include &lt;regex&gt;

#include &quot;EncodeString.hpp&quot;

using namespace std;

typedef basic_regex&lt;char32_t, regex_traits&lt;char32_t&gt;&gt; u32regex;
typedef match_results&lt;u32string::const_iterator&gt; u32smatch;


int main()
{
    u32string before = U&quot;てくまくまやこんてくまくまやこん むらやましゃちょうよ おおきなくまにな～ぁれ&quot;;
    u32string after;
    u32regex reg(U&quot;くま&quot;);
    u32smatch match;

    u32string textbuf = before;
    while (regex_search(textbuf, match, reg)) {
        after += match.prefix().str() + U&quot;ぱんだ&quot;;
        textbuf = match.suffix().str();
    }
    after += textbuf;

    cout &lt;&lt; &quot;before: &quot; &lt;&lt; EncodeString&lt;char32_t, chset_Utf32&gt;(before, chset_Utf8).getCharArray() &lt;&lt; endl;
    cout &lt;&lt; &quot;after: &quot; &lt;&lt; EncodeString&lt;char32_t, chset_Utf32&gt;(after, chset_Utf8).getCharArray() &lt;&lt; endl;

    return 0;
}
</pre>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2011/12/27/cpp11-unicode/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
