<?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>イグトランスの頭の中（のかけら）</title> <atom:link href="http://dev.activebasic.com/egtra/feed/" rel="self" type="application/rss+xml" /><link>http://dev.activebasic.com/egtra</link> <description>ActiveBasicを中心にプログラミングの話をぼちぼちと。なお、本文中の私の書いたソースコードは、NYSLでライセンスします（つまり、ご自由にどうぞ）。</description> <lastBuildDate>Mon, 07 May 2012 17:57:10 +0000</lastBuildDate> <language>ja</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <atom:link rel='hub' href='http://dev.activebasic.com/egtra/?pushpress=hub'/> <item><title>Metro styleアプリでのC++と非同期</title><link>http://dev.activebasic.com/egtra/2012/05/08/487/</link> <comments>http://dev.activebasic.com/egtra/2012/05/08/487/#comments</comments> <pubDate>Mon, 07 May 2012 17:30:41 +0000</pubDate> <dc:creator>egtra</dc:creator> <category><![CDATA[C++]]></category> <category><![CDATA[WinRT]]></category> <category><![CDATA[C++/CX]]></category> <category><![CDATA[Parallel Pattern Library]]></category> <category><![CDATA[Windows 8]]></category> <guid
isPermaLink="false">http://dev.activebasic.com/egtra/?p=487</guid> <description><![CDATA[Windows 8のConsumer PreviewおよびおよびVisual Studio 11 βで、C++Parallel Patterns Library (PPL)にWindows Runtimeへの対応が入りました。試しに使ってみようと思い、以前のMessageDialogのサンプルを書き直してみました。]]></description> <content:encoded><![CDATA[<p>注意：この記事はWindows 8 Consumer Preview時点でのものです。この内容も将来に渡って正しい内容とは限りません。</p><p>「<a
href="/egtra/2011/09/16/402/">Metro StyleアプリでのMessageBoxの代わりっぽいやつ</a>」の続編です。</p><blockquote><p>このように、この結果を受け取るだけで非同期になるようですよ。なんの支援もないと相当厳しいです。C#ならasyncとか使えるみたいですが、Visual C++はどうなんでしょう？</p></blockquote><p>Windows 8のConsumer PreviewおよびVisual Studio 11 βでこの懸念が解消されました。Parallel Patterns Library (PPL)にWindows Runtimeへの対応が入ったのです。なお、PPLは、Visual C++ 2010より存在する並行処理のためのライブラリです。</p><p>というわけで、前回のサンプルはこのように書けます。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #666666;">// #include &lt;ppltasks.h&gt;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> Concurrency<span style="color: #008080;">;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> Windows<span style="color: #008080;">::</span><span style="color: #007788;">Foundation</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> Windows<span style="color: #008080;">::</span><span style="color: #007788;">UI</span><span style="color: #008080;">::</span><span style="color: #007788;">Popups</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">auto</span> d <span style="color: #000080;">=</span> ref <span style="color: #0000dd;">new</span> MessageDialog<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Hello world&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
task<span style="color: #000080;">&lt;</span>IUICommand<span style="color: #000040;">^</span><span style="color: #000080;">&gt;</span> a<span style="color: #008000;">&#40;</span>d<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>ShowAsync<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
a.<span style="color: #007788;">then</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">this</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#40;</span>IUICommand<span style="color: #000040;">^</span> op<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// ……</span>
  ButtonOk<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>Content <span style="color: #000080;">=</span> ref <span style="color: #0000dd;">new</span> String<span style="color: #008000;">&#40;</span>L<span style="color: #FF0000;">&quot;Done&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></div></div><p>これなら許容範囲内だと私は思います。</p><p>参考：</p><ul><li><a
href="http://blogs.msdn.com/b/windowsappdev_ja/archive/2012/03/26/windows.aspx">Windows ランタイムの非同期性により高速で滑らかなアプリにする &#8211; Windows 8 アプリ開発者ブログ &#8211; Site Home &#8211; MSDN Blogs</a></li><li><a
href="http://msdn.microsoft.com/ja-jp/library/hh750082(VS.110).aspx">Metroのフォーム アプリケーションの C++ で非同期操作を作成できます。 (Creating Asynchronous Operations in C++ for Metro style Apps)</a> &#8211; MSDNライブラリ</li><li><a
href="http://msdn.microsoft.com/en-us/library/windows/apps/hh750113.aspx">task Class (Concurrency Runtime)</a> &#8211; MSDNライブラリ</li></ul> ]]></content:encoded> <wfw:commentRss>http://dev.activebasic.com/egtra/2012/05/08/487/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>ストリームの一時オブジェクト その2 実装</title><link>http://dev.activebasic.com/egtra/2012/05/04/486/</link> <comments>http://dev.activebasic.com/egtra/2012/05/04/486/#comments</comments> <pubDate>Thu, 03 May 2012 15:25:46 +0000</pubDate> <dc:creator>egtra</dc:creator> <category><![CDATA[C++]]></category> <category><![CDATA[C++11]]></category> <category><![CDATA[iostream]]></category> <guid
isPermaLink="false">http://dev.activebasic.com/egtra/?p=486</guid> <description><![CDATA[C++でストリームの一時オブジェクトへの対応が強化された話の続きです。内部実装を追ったという話です。]]></description> <content:encoded><![CDATA[<p>昨日（<a
href="/egtra/2012/05/03/484/">ストリームの一時オブジェクト</a>）の続きです。内部実装を追ったという話です。</p><hr
/><p>さて、それを実現しているのは、C++の標準ライブラリに新しく追加された以下の関数です。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> charT, <span style="color: #0000ff;">class</span> traits, <span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
basic_istream<span style="color: #000080;">&lt;</span>charT, traits<span style="color: #000080;">&gt;</span><span style="color: #000040;">&amp;</span>
operator<span style="color: #000080;">&gt;&gt;</span><span style="color: #008000;">&#40;</span>basic_istream<span style="color: #000080;">&lt;</span>charT, traits<span style="color: #000080;">&gt;</span><span style="color: #000040;">&amp;&amp;</span> is, T<span style="color: #000040;">&amp;</span> x<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">return</span> is <span style="color: #000080;">&gt;&gt;</span> x<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> charT, <span style="color: #0000ff;">class</span> traits, <span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
basic_ostream<span style="color: #000080;">&lt;</span>charT, traits<span style="color: #000080;">&gt;</span><span style="color: #000040;">&amp;</span>
operator<span style="color: #000080;">&lt;&lt;</span><span style="color: #008000;">&#40;</span>basic_ostream<span style="color: #000080;">&lt;</span>charT, traits<span style="color: #000080;">&gt;</span><span style="color: #000040;">&amp;&amp;</span> os, <span style="color: #0000ff;">const</span> T<span style="color: #000040;">&amp;</span> x<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">return</span> os <span style="color: #000080;">&lt;&lt;</span> x<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><p>basic_istreamに対する&gt;&gt;とbasic_ostreamに対する&lt;&lt;、計2つの関数です。</p><p>通常、&gt;&gt;演算子や&lt;&lt;演算子では、basic_istreamやbasic_ostreamのlvalue参照型（&amp;の参照型）を引数に取ります。そのため、一時オブジェクト (prvalue) を渡せないのでした。そこで、このようにrvalue参照型（&amp;&amp;の参照型）の多重定義を追加したのです。</p><p>いったんrvalue参照型の変数で受け取ってしまえば、xvalueになります。xvalueならlvalue参照に渡せるので、関数定義にあるreturn文内の&lt;&lt;や&gt;&gt;は期待した通りに動作します。しかも、lvalue参照を返しているため、さらに&lt;&lt;や&gt;&gt;を並べても正しく動作するというわけです。</p> ]]></content:encoded> <wfw:commentRss>http://dev.activebasic.com/egtra/2012/05/04/486/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>ストリームの一時オブジェクト</title><link>http://dev.activebasic.com/egtra/2012/05/03/484/</link> <comments>http://dev.activebasic.com/egtra/2012/05/03/484/#comments</comments> <pubDate>Wed, 02 May 2012 15:50:16 +0000</pubDate> <dc:creator>egtra</dc:creator> <category><![CDATA[C++]]></category> <category><![CDATA[C++11]]></category> <category><![CDATA[iostream]]></category> <guid
isPermaLink="false">http://dev.activebasic.com/egtra/?p=484</guid> <description><![CDATA[C++11では、iostream関係のオブジェクトを一時オブジェクトとして作成するコードが容易に記述できるようになりました。]]></description> <content:encoded><![CDATA[<p>C++11では、iostream関係のオブジェクトを一時オブジェクトとして作成するコードが容易に記述できるようになりました。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #339900;">#include &lt;fstream&gt;</span>
<span style="color: #339900;">#include &lt;string&gt;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  std<span style="color: #008080;">::</span><span style="color: #007788;">string</span> s <span style="color: #000080;">=</span> <span style="color: #FF0000;">&quot;hello world&quot;</span><span style="color: #008080;">;</span>
  std<span style="color: #008080;">::</span><span style="color: #007788;">ofstream</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;hoge.txt&quot;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> s <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><p>C++03だと上のコードはエラーになります。厄介なことに、型によっては中途半端にコンパイルできるのでタチが悪いです。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #339900;">#include &lt;fstream&gt;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  std<span style="color: #008080;">::</span><span style="color: #007788;">ofstream</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;hoge.txt&quot;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;hello world&quot;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><p>C++03でこれを実行すると、謎の十六進法の値が出力されると思います。void*を出力する&lt;&lt;演算子が見つかるからです。もちろん、C++11なら、ばっちしhello worldが出力されるので安心してください。</p><p>この例ではofstreamを例に取りましたが、basic_ostream/basic_istreamに対する変更なので、ifstream/fstreamやstringstream類でも同じです。</p><p>なお、Visual C++では/we4239コンパイラオプションを付けましょう。そうしないと、2008およびそれ以前では上記C++03の挙動になりません。C++規格準拠の挙動に近づける設定なので、C++11対応し始めている2010およびそれ以降でも使用して損はありません。</p><hr
/><p><ins
datetime="2012-05-08T02:45:00+09:00">2012年5月8日：basic_ofstream/basic_ifstreamをbasic_ostream/basic_istreamへ修正</ins></p> ]]></content:encoded> <wfw:commentRss>http://dev.activebasic.com/egtra/2012/05/03/484/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>printfの書式指定をiostreamで再現できない場合</title><link>http://dev.activebasic.com/egtra/2012/05/01/482/</link> <comments>http://dev.activebasic.com/egtra/2012/05/01/482/#comments</comments> <pubDate>Mon, 30 Apr 2012 22:32:17 +0000</pubDate> <dc:creator>egtra</dc:creator> <category><![CDATA[C]]></category> <category><![CDATA[C++]]></category> <category><![CDATA[iostream]]></category> <category><![CDATA[printf系]]></category> <guid
isPermaLink="false">http://dev.activebasic.com/egtra/?p=482</guid> <description><![CDATA[printf系の書式指定とC++のiostreamのマニピュレータはおおむね1対1に対応しているものと思っていましたが、微妙に噛み合わない場合を見つけました。整数型に精度指定をしていた場合です。]]></description> <content:encoded><![CDATA[<p>printf系の書式指定とC++のiostreamのマニピュレータはおおむね1対1に対応しているものと思っていましたが、微妙に噛み合わない場合を見つけました。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #339900;">#include &lt;cstdio&gt;</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;iomanip&gt;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
  <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%4x<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #208080;">0x20</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> setw<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> hex <span style="color: #000080;">&lt;&lt;</span> <span style="color: #208080;">0x20</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
&nbsp;
  <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%#.8x<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #208080;">0xbeef</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> internal <span style="color: #000080;">&lt;&lt;</span> showbase <span style="color: #000080;">&lt;&lt;</span> setfill<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">'0'</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> setw<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">10</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #208080;">0xbeef</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
  <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%#.8x<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> internal <span style="color: #000080;">&lt;&lt;</span> showbase <span style="color: #000080;">&lt;&lt;</span> setfill<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">'0'</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> setw<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">10</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">0</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><p>これを出力すると次のようになります</p><pre><samp>0x0000beef
0x0000beef
00000000
0000000000</samp></pre><p>そもそもsetwはフィールド幅、printfの&#8221;%8x&#8221;の8に相当する指定です。&#8221;%.8x&#8221;の8は精度なのでsetprecisionが相当すると言いたいところですが、iostreamのsetprecisionは浮動小数点数限定なのです。setwで代用できるかと思っていましたが、ご覧のように完全にprintfと同じ結果を出すことができませんでした。</p><p>このほか、&#8221;%12.8x&#8221;のようにフィールド幅・精度の両方を指定した場合もiostreamでは再現できないのではないかと思います。</p> ]]></content:encoded> <wfw:commentRss>http://dev.activebasic.com/egtra/2012/05/01/482/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Boost.ThreadとBoost.Optional</title><link>http://dev.activebasic.com/egtra/2012/04/19/480/</link> <comments>http://dev.activebasic.com/egtra/2012/04/19/480/#comments</comments> <pubDate>Wed, 18 Apr 2012 17:07:34 +0000</pubDate> <dc:creator>egtra</dc:creator> <category><![CDATA[C++]]></category> <category><![CDATA[Boost]]></category> <category><![CDATA[Boost.InPlaceFactory]]></category> <category><![CDATA[Boost.Optional]]></category> <category><![CDATA[Boost.Thread]]></category> <guid
isPermaLink="false">http://dev.activebasic.com/egtra/?p=480</guid> <description><![CDATA[Boost.ThreadとBoost.OptionalそしてBoost.In place factoryを使用すると、任意のタイミングでスレッドを実行開始するコードが書けます。そのサンプルです。]]></description> <content:encoded><![CDATA[<p>次の2つを混ぜます。</p><ul><li><a
href="http://d.hatena.ne.jp/faith_and_brave/20120418/1334731512">std::threadをあとから開始。それとムーブ対応したコンテナについて &#8211; Faith and Brave &#8211; C++で遊ぼう</a></li><li><a
href="http://d.hatena.ne.jp/gintenlabo/20100428/1272470686">Boost.Optional と Boost.InPlaceFactory で初期化遅延 &#8211; 銀天随筆集</a></li></ul><p>Boost.Optionalで初期化を遅らせる技法をBoost.Thread（コンストラクトするとスレッドが動き出す）と組み合わせるとどうなるか、任意のタイミングで実行を開始できるようになるというわけです。</p><p>そんなわけで、Akiraさんの「std::threadをあとから開始。それとムーブ対応したコンテナについて」の記事の冒頭のコードをBoost.OptionalとIn place facotryで書き直したものがこちらです。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;boost/optional.hpp&gt;</span>
<span style="color: #339900;">#include &lt;boost/utility/in_place_factory.hpp&gt;</span>
<span style="color: #339900;">#include &lt;boost/thread.hpp&gt;</span>
&nbsp;
<span style="color: #0000ff;">class</span> X <span style="color: #008000;">&#123;</span>
  boost<span style="color: #008080;">::</span><span style="color: #007788;">optional</span><span style="color: #000080;">&lt;</span>boost<span style="color: #008080;">::</span><span style="color: #007788;">thread</span><span style="color: #000080;">&gt;</span> thread_<span style="color: #008080;">;</span>
&nbsp;
  <span style="color: #0000ff;">void</span> do_<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;do&quot;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
  ~X<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>thread_<span style="color: #008000;">&#41;</span>
      thread_<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>join<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
&nbsp;
  <span style="color: #666666;">// あとで実行(shared_ptr::resetでthreadを作る)</span>
  <span style="color: #0000ff;">void</span> start<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
    thread_ <span style="color: #000080;">=</span> boost<span style="color: #008080;">::</span><span style="color: #007788;">in_place</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">this</span><span style="color: #008000;">&#93;</span> <span style="color: #008000;">&#123;</span> do_<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  X x<span style="color: #008080;">;</span>
  x.<span style="color: #007788;">start</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><p>このコードは、Visual C++ 2010で動くことを確認しました。</p> ]]></content:encoded> <wfw:commentRss>http://dev.activebasic.com/egtra/2012/04/19/480/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Internet Explorer10でもX-UA-Compatibleは使える</title><link>http://dev.activebasic.com/egtra/2012/04/03/478/</link> <comments>http://dev.activebasic.com/egtra/2012/04/03/478/#comments</comments> <pubDate>Tue, 03 Apr 2012 14:37:17 +0000</pubDate> <dc:creator>egtra</dc:creator> <category><![CDATA[Windows]]></category> <category><![CDATA[HTML]]></category> <category><![CDATA[Internet Explorer]]></category> <guid
isPermaLink="false">http://dev.activebasic.com/egtra/?p=478</guid> <description><![CDATA[Internet Explorer10でもX-UA-Compatibleは有効で、IE=10の場合、IE10モードに切り替わるというMicrosoftのウェブサイト内の記述を探し出しました。]]></description> <content:encoded><![CDATA[<p><a
href="http://msdn.microsoft.com/en-us/library/ff955275(VS.85).aspx">[MS-IEDOCO]: X-UA-Compatibility Meta Tag and HTTP Response Header</a>の図によれば、Internet Explorer 10でもX-UA-Compatibleは有効、すなわちIE=10を指定してInternet Explorer 10のドキュメントモードに切り替えることが可能なようです。</p><p>Windows Internet Explorer 10 開発者向けガイドの<a
href="http://msdn.microsoft.com/ja-jp/library/hh673527(VS.85).aspx">互換性 (Preliminary)</a>ではX-UA-Compatibleが非推と書いてあるので、もしかしてIE8/9にはX-UA-Compatible有り、IE10ではX-UA-Compatibleなしで配信しなければならないのかと心配になりました。</p> ]]></content:encoded> <wfw:commentRss>http://dev.activebasic.com/egtra/2012/04/03/478/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>仮想基底クラス</title><link>http://dev.activebasic.com/egtra/2012/03/20/474/</link> <comments>http://dev.activebasic.com/egtra/2012/03/20/474/#comments</comments> <pubDate>Mon, 19 Mar 2012 18:24:47 +0000</pubDate> <dc:creator>egtra</dc:creator> <category><![CDATA[C++]]></category> <category><![CDATA[virtual]]></category> <guid
isPermaLink="false">http://dev.activebasic.com/egtra/?p=474</guid> <description><![CDATA[C++の仮想基底クラスでは、最派生クラスの初期化子で仮想基底クラスの初期化（コンストラクタへの引数を与えること）を行う必要があるという話です。]]></description> <content:encoded><![CDATA[<p>C++の仮想基底クラスの話です。これ、存在は知っていても使うことのない機能の筆頭ではないかと思います。</p><p>さて、このプログラムではBのコンストラクタにどんな値が渡されるでしょうか。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #339900;">#include &lt;iostream&gt;</span>
&nbsp;
<span style="color: #0000ff;">class</span> B
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
  <span style="color: #0000ff;">explicit</span> B<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> x<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
    std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;B::B &quot;</span> <span style="color: #000080;">&lt;&lt;</span> x <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">class</span> Hoge <span style="color: #008080;">:</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">virtual</span> B
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
  Hoge<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008080;">:</span> B<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">class</span> Piyo <span style="color: #008080;">:</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">virtual</span> B
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
  Piyo<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008080;">:</span> B<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">class</span> D <span style="color: #008080;">:</span> <span style="color: #0000ff;">public</span> Hoge, <span style="color: #0000ff;">public</span> Piyo
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
  D<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008080;">:</span> B<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">10</span><span style="color: #008000;">&#41;</span>, Hoge<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  D x<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><p>答えは10です。そもそも、DはBから直接派生していないのに、DのコンストラクタでBに対する引数を指定できることを不思議に思うかもしれません。そう、virutal基底クラスは最派生クラスでコンストラクタへの引数を指定します。もし、DでBへの初期化子を書かなかったら、コンパイルエラーになります。HogeとPiyo、それぞれでBへの初期化子を与えており、どちらを採用すべきか曖昧、それを決定する責任を持つのは最派生クラスというわけです。</p><p>もちろん、この挙動は多重継承がない場合にも適用されます。次のプログラムでは、Bに2が渡されます。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #339900;">#include &lt;iostream&gt;</span>
&nbsp;
<span style="color: #0000ff;">class</span> B
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
  <span style="color: #0000ff;">explicit</span> B<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> x<span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
    std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;B::B &quot;</span> <span style="color: #000080;">&lt;&lt;</span> x <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">class</span> Hoge <span style="color: #008080;">:</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">virtual</span> B
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
  Hoge<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008080;">:</span> B<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">class</span> D <span style="color: #008080;">:</span> <span style="color: #0000ff;">public</span> Hoge
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
  D<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008080;">:</span> B<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span>, Hoge<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  D x<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><p>私は、この最派生クラスで指定した初期化子が採用されるという規則、virtual関数のオーバーライドに通じるよなあ、とぼんやり思いました。なお、『C++の設計と進化』では、仮想基底クラスを表すキーワードがvirtualである理由について、virutal基底クラスのメンバ変数アクセスに、概念上virtual関数同様vtblを経由する必要があるからだ、という旨が書かれています（cf. §12.4.1 仮想ベースクラスのレイアウト）。</p> ]]></content:encoded> <wfw:commentRss>http://dev.activebasic.com/egtra/2012/03/20/474/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Windows 8はXDDM (XP Display Driver Model)に対応しない</title><link>http://dev.activebasic.com/egtra/2012/03/14/471/</link> <comments>http://dev.activebasic.com/egtra/2012/03/14/471/#comments</comments> <pubDate>Tue, 13 Mar 2012 17:14:30 +0000</pubDate> <dc:creator>egtra</dc:creator> <category><![CDATA[WinAPI]]></category> <category><![CDATA[Windows]]></category> <category><![CDATA[WDDM]]></category> <category><![CDATA[Windows 8]]></category> <guid
isPermaLink="false">http://dev.activebasic.com/egtra/?p=471</guid> <description><![CDATA[マイクロソフトのホワイトペーパー「Windows 8 Developer Preview での WDDM の強化」より、XDDM (XP Display Driver Model)についてです。]]></description> <content:encoded><![CDATA[<p>こんな資料を今頃になって見つけました：<a
href="http://msdn.microsoft.com/ja-jp/library/windows/hardware/br259098.aspx">Windows 8 Developer Preview での WDDM の強化</a>。2011年10月11日公開のようです。</p><p>「PART 1: WDDM in Windows 8」に、「Windows 8はXDDMをサポートしないよ」という重要事項が書いてあったので、軽く紹介します。</p><p>軽くおさらい、XDDMはXP Display Driver Modelの略（XPDMという表記もよく見かける）で、2000/XP世代のディスプレイドライバになります。しかしながら、Vista/Server 2008 (NT 6.0)や7/Server 2008 R2 (NT 6.1)でも利用可能でした。参考：<a
href="http://d.hatena.ne.jp/NyaRuRu/20081126/p1">Windows 7 のグラフィックスの変更点を整理する &#8211; NyaRuRuの日記</a>。</p><p>XDDMをサポートしなくなった結果、XDDMである汎用の標準VGAドライバも、WDDM 1.2の「Microsoft Basic Display Driver」に置き換わります。これが使われるのは、専用ドライバをインストールしていない場合、Windowsインストール時、セーフモードなどが挙げられます。もちろん標準VGAドライバ同様、完全なるソフトウェア描画です。しかし、分かりやすい差異として、Aeroが効くようになったというのがあります。</p><p>サーバ系Windowsも例外なくWDDM化されます。それに伴い、WDDM 1.2ではDisplay Only Driverや、Render Only Driverなどといったサブセットと言える種類が増えるようです（フル機能搭載と言えるFull Graphics Driverを含め計3種類）。たとえば、Display Only Driverでは、Windowsがソフトウェアで2D/3D描画を行います。</p><p>ちなみに、WDDM 1.0ドライバ・WDDM 1.1ドライバは使えるそうです（Windows 7でWDDM 1.0ドライバ使えましたしね）。</p><hr
/><p>そういえば、とVirtualBox内に入れてあるWindows 8 DPを起動してデバイスマネージャを開いてみたら、たしかにMicrosoft Basic Display Driverでした。</p><p>最初にWindows 8 DPをインストールしたときから「VirtualBoxがドライバを持っているわけないのにAeroになっている。さては、汎用ドライバのソフトウェア描画でもAero使えるようにしたんだな」と思ってはいましたが、こういうからくりだったようです。</p><hr
/><p><ins
datetime="2012-03-17T22:22:22+09:00"><p>2012年3月17日追記：7/Server 2008 R2を誤ってNT 6.2と表記していたところをNT 6.1へ修正。</p><p></ins></p> ]]></content:encoded> <wfw:commentRss>http://dev.activebasic.com/egtra/2012/03/14/471/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>ラムダ式で再帰する1つの方法</title><link>http://dev.activebasic.com/egtra/2012/03/10/470/</link> <comments>http://dev.activebasic.com/egtra/2012/03/10/470/#comments</comments> <pubDate>Fri, 09 Mar 2012 19:13:40 +0000</pubDate> <dc:creator>egtra</dc:creator> <category><![CDATA[C++]]></category> <category><![CDATA[C++11]]></category> <category><![CDATA[std::function]]></category> <category><![CDATA[ラムダ式]]></category> <guid
isPermaLink="false">http://dev.activebasic.com/egtra/?p=470</guid> <description><![CDATA[C++11のラムダ式で、不動点演算子Yコンビネータによる再帰処理を書いてみました。]]></description> <content:encoded><![CDATA[<p><a
href="http://d.hatena.ne.jp/libdo/20120307/1331126474">C++11のラムダ式で再帰する &#8211; 作業記録と雑記</a>より。</p><div
id="gist-1992944" class="gist"><div
class="gist-file"><div
class="gist-data gist-syntax"><div
class="highlight"><pre><div class='line' id='LC1'><span class="cp">#include &lt;iostream&gt;</span></div><div class='line' id='LC2'><span class="cp">#include &lt;vector&gt;</span></div><div class='line' id='LC3'><span class="cp">#include &lt;algorithm&gt;</span></div><div class='line' id='LC4'><span class="cp">#include &lt;functional&gt;</span></div><div class='line' id='LC5'><br/></div><div class='line' id='LC6'><span class="kt">int</span> <span class="n">main</span><span class="p">(){</span></div><div class='line' id='LC7'>	<span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span></div><div class='line' id='LC8'><br/></div><div class='line' id='LC9'>	<span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">v</span> <span class="o">=</span> <span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">};</span></div><div class='line' id='LC10'><br/></div><div class='line' id='LC11'>	<span class="c1">// vの要素をそれぞれ階乗して出力</span></div><div class='line' id='LC12'>	<span class="n">function</span><span class="o">&lt;</span><span class="kt">int</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="o">&gt;</span> <span class="n">f</span><span class="p">;</span> <span class="c1">// 再帰用に宣言</span></div><div class='line' id='LC13'>	<span class="n">for_each</span><span class="p">(</span><span class="n">v</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">v</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span> <span class="p">[</span><span class="o">&amp;</span><span class="n">f</span><span class="p">](</span><span class="kt">int</span> <span class="k">const</span> <span class="n">i</span><span class="p">){</span> <span class="c1">// 出力用の無名関数</span></div><div class='line' id='LC14'>		<span class="n">cout</span> <span class="o">&lt;&lt;</span></div><div class='line' id='LC15'>		<span class="p">(</span> <span class="c1">// std::function&lt;int (int)&gt; // 本当はここが良い</span></div><div class='line' id='LC16'>		<span class="n">f</span> <span class="o">=</span> <span class="p">[</span><span class="o">&amp;</span><span class="n">f</span><span class="p">](</span><span class="kt">int</span> <span class="n">n</span><span class="p">){</span> <span class="c1">// 階乗する無名関数。再帰のためにfを参照している</span></div><div class='line' id='LC17'>			<span class="k">return</span> <span class="p">((</span><span class="mi">0</span> <span class="o">==</span> <span class="n">n</span><span class="p">)</span><span class="o">?</span><span class="p">(</span></div><div class='line' id='LC18'>				<span class="mi">1</span></div><div class='line' id='LC19'>			<span class="p">)</span><span class="o">:</span><span class="p">(</span></div><div class='line' id='LC20'>				<span class="n">n</span> <span class="o">*</span> <span class="n">f</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span></div><div class='line' id='LC21'>			<span class="p">));</span></div><div class='line' id='LC22'>		<span class="p">})(</span><span class="n">i</span><span class="p">)</span> <span class="o">&lt;&lt;</span></div><div class='line' id='LC23'>		<span class="n">endl</span><span class="p">;</span></div><div class='line' id='LC24'>	<span class="p">});</span></div><div class='line' id='LC25'><br/></div><div class='line' id='LC26'><span class="p">}</span></div><div class='line' id='LC27'><span class="cm">/* &lt;-</span></div><div class='line' id='LC28'><span class="cm">1</span></div><div class='line' id='LC29'><span class="cm">2</span></div><div class='line' id='LC30'><span class="cm">6</span></div><div class='line' id='LC31'><span class="cm">24</span></div><div class='line' id='LC32'><span class="cm">120</span></div><div class='line' id='LC33'><span class="cm">*/</span> </div></pre></div></div><div
class="gist-meta"> <a
href="https://gist.github.com/raw/1992944/8c4cc7a61838ba2bd7a9fe945d69b1a4ed9c214e/recursive_func_in_lambda.cpp" style="float:right;">view raw</a> <a
href="https://gist.github.com/1992944#file_recursive_func_in_lambda.cpp" style="float:right;margin-right:10px;color:#666">recursive_func_in_lambda.cpp</a> <a
href="https://gist.github.com/1992944">This Gist</a> brought to you by <a
href="http://github.com">GitHub</a>.</div></div></div><p>上記記事の内のコードでは、ラムダ式で再帰を実現するために、自分自身が格納される変数を「キャプチャ」しています。しかし、それだけがすべてではありません。</p><p>もう1つ、「引数に取る」という方法があります。しかも都合の良いことに、この方法にはお決まりのパターンが存在するのです。次のコード内のFixという関数がその役を果たします。</p><div
id="gist-2007773" class="gist"><div
class="gist-file"><div
class="gist-data gist-syntax"><div
class="highlight"><pre><div class='line' id='LC1'><span class="cp">#include &lt;iostream&gt;</span></div><div class='line' id='LC2'><span class="cp">#include &lt;vector&gt;</span></div><div class='line' id='LC3'><span class="cp">#include &lt;algorithm&gt;</span></div><div class='line' id='LC4'><span class="cp">#include &lt;functional&gt;</span></div><div class='line' id='LC5'><br/></div><div class='line' id='LC6'><span class="k">typedef</span> <span class="n">std</span><span class="o">::</span><span class="n">function</span><span class="o">&lt;</span><span class="kt">int</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="o">&gt;</span> <span class="n">F</span><span class="p">;</span></div><div class='line' id='LC7'><br/></div><div class='line' id='LC8'><span class="n">F</span> <span class="n">Fix</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">function</span><span class="o">&lt;</span><span class="n">F</span> <span class="p">(</span><span class="n">F</span><span class="p">)</span><span class="o">&gt;</span> <span class="n">f</span><span class="p">)</span></div><div class='line' id='LC9'><span class="p">{</span></div><div class='line' id='LC10'>	<span class="k">return</span> <span class="p">[</span><span class="o">=</span><span class="p">](</span><span class="kt">int</span> <span class="n">t</span><span class="p">)</span> <span class="p">{</span><span class="k">return</span> <span class="n">f</span><span class="p">(</span><span class="n">Fix</span><span class="p">(</span><span class="n">f</span><span class="p">))(</span><span class="n">t</span><span class="p">);};</span></div><div class='line' id='LC11'><span class="p">}</span></div><div class='line' id='LC12'><br/></div><div class='line' id='LC13'><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span></div><div class='line' id='LC14'><br/></div><div class='line' id='LC15'><span class="kt">int</span> <span class="n">main</span><span class="p">(){</span></div><div class='line' id='LC16'><br/></div><div class='line' id='LC17'>	<span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">v</span> <span class="o">=</span> <span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">};</span></div><div class='line' id='LC18'><br/></div><div class='line' id='LC19'>	<span class="c1">// vの要素をそれぞれ階乗して出力</span></div><div class='line' id='LC20'>	<span class="n">for_each</span><span class="p">(</span><span class="n">v</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">v</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span> <span class="p">[](</span><span class="kt">int</span> <span class="k">const</span> <span class="n">i</span><span class="p">){</span> <span class="c1">// 出力用の無名関数</span></div><div class='line' id='LC21'>		<span class="n">cout</span> <span class="o">&lt;&lt;</span></div><div class='line' id='LC22'>		<span class="n">Fix</span><span class="p">([](</span><span class="n">F</span> <span class="n">f</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">F</span><span class="p">{</span> <span class="c1">// 「階乗する無名関数」を返す関数。</span></div><div class='line' id='LC23'>			<span class="k">return</span> <span class="p">[</span><span class="o">=</span><span class="p">](</span><span class="kt">int</span> <span class="n">n</span><span class="p">){</span></div><div class='line' id='LC24'>				<span class="k">return</span> <span class="p">((</span><span class="mi">0</span> <span class="o">==</span> <span class="n">n</span><span class="p">)</span><span class="o">?</span><span class="p">(</span></div><div class='line' id='LC25'>					<span class="mi">1</span></div><div class='line' id='LC26'>				<span class="p">)</span><span class="o">:</span><span class="p">(</span></div><div class='line' id='LC27'>					<span class="n">n</span> <span class="o">*</span> <span class="n">f</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span></div><div class='line' id='LC28'>				<span class="p">));</span></div><div class='line' id='LC29'>			<span class="p">};</span></div><div class='line' id='LC30'>		<span class="p">})(</span><span class="n">i</span><span class="p">)</span> <span class="o">&lt;&lt;</span></div><div class='line' id='LC31'>		<span class="n">endl</span><span class="p">;</span></div><div class='line' id='LC32'>	<span class="p">});</span></div><div class='line' id='LC33'><br/></div><div class='line' id='LC34'><span class="p">}</span></div></pre></div></div><div
class="gist-meta"> <a
href="https://gist.github.com/raw/2007773/a7176263abfe3ad1ab59042822e9f577617fd386/recursive_func_in_lambda.cpp" style="float:right;">view raw</a> <a
href="https://gist.github.com/2007773#file_recursive_func_in_lambda.cpp" style="float:right;margin-right:10px;color:#666">recursive_func_in_lambda.cpp</a> <a
href="https://gist.github.com/2007773">This Gist</a> brought to you by <a
href="http://github.com">GitHub</a>.</div></div></div><p>このFixは不動点演算子などと呼ばれるものになります。3年くらい前に、はてなダイアリー界隈で流行したので、ググれば今でもいろいろ出てきます。</p><ul><li><a
href="http://d.hatena.ne.jp/r-west/20090422/1240400570">さあ、Yコンビネータ(不動点演算子)を使おう！ &#8211; よくわかりません</a></li><li><a
href="http://d.hatena.ne.jp/r-west/20090422/1240400570">ラムダ計算とチューリングマシンの違い &#8211; きしだのはてな</a></li><li><a
href="http://d.hatena.ne.jp/amachang/20080124/1201199469">Y コンビネータって何？ &#8211; IT戦記</a>：型のあるC++では、こうは行かないと思います。</li></ul> ]]></content:encoded> <wfw:commentRss>http://dev.activebasic.com/egtra/2012/03/10/470/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>money_put/put_moneyで扱える型</title><link>http://dev.activebasic.com/egtra/2012/02/25/467/</link> <comments>http://dev.activebasic.com/egtra/2012/02/25/467/#comments</comments> <pubDate>Sat, 25 Feb 2012 12:11:56 +0000</pubDate> <dc:creator>egtra</dc:creator> <category><![CDATA[C++]]></category> <category><![CDATA[money_put]]></category> <category><![CDATA[put_money]]></category> <category><![CDATA[std::ios::imbue]]></category> <category><![CDATA[std::locale]]></category> <category><![CDATA[std::use_facet]]></category> <guid
isPermaLink="false">http://dev.activebasic.com/egtra/?p=467</guid> <description><![CDATA[C++のmoney_putとput_moneyでは、浮動小数点型のほか文字列も扱えるという話です。]]></description> <content:encoded><![CDATA[<p>前回のコードでは、数値をdoubleで出力していましたが、文字列で出力させることも可能です。<br
/> 実際にお金に関する値を扱うときにfloat/double/long doubleを使うことはあり得ず、<br
/> かといって十進法ベースの実数型が標準ライブラリにあるわけでもないC++では、<br
/> stringが唯一money_put/put_moneyでまともに使える型と言えるでしょう。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;locale&gt;</span>
<span style="color: #339900;">#include &lt;string&gt;</span>
<span style="color: #339900;">#include &lt;iomanip&gt;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// en_US.ISO-8859-1相当</span>
  std<span style="color: #008080;">::</span><span style="color: #007788;">locale</span> l<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;English_United States.1252&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span>.<span style="color: #007788;">imbue</span><span style="color: #008000;">&#40;</span>l<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
  std<span style="color: #008080;">::</span><span style="color: #007788;">string</span> x <span style="color: #000080;">=</span> <span style="color: #FF0000;">&quot;123456789012345678901234567890.123&quot;</span><span style="color: #008080;">;</span>
&nbsp;
  <span style="color: #666666;">// money_put</span>
  <span style="color: #0000ff;">auto</span> <span style="color: #0000ff;">const</span><span style="color: #000040;">&amp;</span> m <span style="color: #000080;">=</span> std<span style="color: #008080;">::</span><span style="color: #007788;">use_facet</span><span style="color: #000080;">&lt;</span>std<span style="color: #008080;">::</span><span style="color: #007788;">money_put</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">char</span><span style="color: #000080;">&gt;&gt;</span><span style="color: #008000;">&#40;</span>l<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  m.<span style="color: #007788;">put</span><span style="color: #008000;">&#40;</span>std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span>, <span style="color: #0000ff;">false</span>, std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span>, <span style="color: #FF0000;">' '</span>, x<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
&nbsp;
  <span style="color: #666666;">// put_money</span>
  std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">put_money</span><span style="color: #008000;">&#40;</span>x, <span style="color: #0000ff;">false</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><hr/> <ins
datetime="2012-03-03T16:59:00+09:00"><p>2012年3月3日追記：コメント内のen_JPをen_USへ修正。</p><p></ins></p> ]]></content:encoded> <wfw:commentRss>http://dev.activebasic.com/egtra/2012/02/25/467/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>put_moneyとmoney_put</title><link>http://dev.activebasic.com/egtra/2012/01/31/466/</link> <comments>http://dev.activebasic.com/egtra/2012/01/31/466/#comments</comments> <pubDate>Mon, 30 Jan 2012 17:35:15 +0000</pubDate> <dc:creator>egtra</dc:creator> <category><![CDATA[C++]]></category> <category><![CDATA[C++11]]></category> <category><![CDATA[money_put]]></category> <category><![CDATA[put_money]]></category> <category><![CDATA[std::ios::imbue]]></category> <category><![CDATA[std::locale]]></category> <category><![CDATA[std::use_facet]]></category> <guid
isPermaLink="false">http://dev.activebasic.com/egtra/?p=466</guid> <description><![CDATA[C++11のput_moneyのサンプルと、C++03のmoney_putのサンプルです。]]></description> <content:encoded><![CDATA[<p>某所でC++11のput_moneyで盛り上がっていたので、それに関連してC++03だとこうなるという話を書きます。</p><p>まず、C++11だとこんな風に書けるのです。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;iomanip&gt;</span>
<span style="color: #339900;">#include &lt;locale&gt;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  std<span style="color: #008080;">::</span><span style="color: #007788;">string</span> loc<span style="color: #008080;">;</span>
  std<span style="color: #008080;">::</span><span style="color: #0000dd;">cin</span> <span style="color: #000080;">&gt;&gt;</span> loc<span style="color: #008080;">;</span>
&nbsp;
  std<span style="color: #008080;">::</span><span style="color: #007788;">locale</span> l<span style="color: #008000;">&#40;</span>loc.<span style="color: #007788;">c_str</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span>.<span style="color: #007788;">imbue</span><span style="color: #008000;">&#40;</span>l<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
  <span style="color: #0000ff;">double</span> x <span style="color: #000080;">=</span> <span style="color:#800080;">123456.789</span><span style="color: #008080;">;</span>
  std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">put_money</span><span style="color: #008000;">&#40;</span>x, <span style="color: #0000ff;">false</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><p>put_moneyはlocaleに従って金額の書式で出力するマニピュレータです。</p><p>C++03でも、localeを直接叩けば同じ出力が得られます。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;locale&gt;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  std<span style="color: #008080;">::</span><span style="color: #007788;">string</span> loc<span style="color: #008080;">;</span>
  std<span style="color: #008080;">::</span><span style="color: #0000dd;">cin</span> <span style="color: #000080;">&gt;&gt;</span> loc<span style="color: #008080;">;</span>
&nbsp;
  std<span style="color: #008080;">::</span><span style="color: #007788;">locale</span> l<span style="color: #008000;">&#40;</span>loc.<span style="color: #007788;">c_str</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span>.<span style="color: #007788;">imbue</span><span style="color: #008000;">&#40;</span>l<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
  <span style="color: #0000ff;">double</span> x <span style="color: #000080;">=</span> <span style="color:#800080;">123456.789</span><span style="color: #008080;">;</span>
&nbsp;
  std<span style="color: #008080;">::</span><span style="color: #007788;">money_put</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">char</span><span style="color: #000080;">&gt;</span> <span style="color: #0000ff;">const</span><span style="color: #000040;">&amp;</span> m <span style="color: #000080;">=</span>
    std<span style="color: #008080;">::</span><span style="color: #007788;">use_facet</span><span style="color: #000080;">&lt;</span>std<span style="color: #008080;">::</span><span style="color: #007788;">money_put</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">char</span><span style="color: #000080;">&gt;&gt;</span><span style="color: #008000;">&#40;</span>l<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  m.<span style="color: #007788;">put</span><span style="color: #008000;">&#40;</span>std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span>, <span style="color: #0000ff;">false</span>, std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span>, <span style="color: #FF0000;">' '</span>, x<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><p>なお、この金額書式の情報は、C++で新規に登場したのではなく、Cでも存在しました。CだとLC_MONETARYのsetlocaleとlocaleconv/lconvです。</p> ]]></content:encoded> <wfw:commentRss>http://dev.activebasic.com/egtra/2012/01/31/466/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>bindを書く</title><link>http://dev.activebasic.com/egtra/2012/01/10/464/</link> <comments>http://dev.activebasic.com/egtra/2012/01/10/464/#comments</comments> <pubDate>Mon, 09 Jan 2012 18:09:52 +0000</pubDate> <dc:creator>egtra</dc:creator> <category><![CDATA[C++]]></category> <category><![CDATA[bind]]></category> <guid
isPermaLink="false">http://dev.activebasic.com/egtra/?p=464</guid> <description><![CDATA[BoostやC++11にあるようなbind関数を自分で作ってみました。]]></description> <content:encoded><![CDATA[<p>以前、bindを作りたいという話を書きました（参考：<a
href="/egtra/2011/12/18/457/">Boost.Fusionを使ってライブラリを書く</a>）。それを思い出して、えいやっと書いてしまいました。</p><p>例によって、ソースです: <a
href="/egtra/download/bind-1.cpp">bind-1.cpp</a>。</p><p>Boost.Ref使っているのはご愛嬌、さすがにref/cref (ference_wrapper)はbindと比べれば簡単に作れます。また、以前のFuisonの話のときとは、随分と見た目（雰囲気）が違いますが、やっていることはそう変わりないつもりです。</p><p>1度自分で書いてしまえば、あとはBoostなど各種実装を覗く気にもなるというものです。</p> ]]></content:encoded> <wfw:commentRss>http://dev.activebasic.com/egtra/2012/01/10/464/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Visual C++のlocale文字列</title><link>http://dev.activebasic.com/egtra/2011/12/30/463/</link> <comments>http://dev.activebasic.com/egtra/2011/12/30/463/#comments</comments> <pubDate>Fri, 30 Dec 2011 14:12:47 +0000</pubDate> <dc:creator>egtra</dc:creator> <category><![CDATA[C++]]></category> <category><![CDATA[VC++]]></category> <category><![CDATA[locale]]></category> <category><![CDATA[setlocale]]></category> <category><![CDATA[std::locale]]></category> <guid
isPermaLink="false">http://dev.activebasic.com/egtra/?p=463</guid> <description><![CDATA[Visual C++のsetlocaleやstd::localeに与えられる文字列について、MSDNライブラリの該当項目の紹介などです。]]></description> <content:encoded><![CDATA[<p>前の記事では、Viusal C++の例でstd::localeのコンストラクタやstd::setlocaleに対して&#8221;jpn_jpn.932&#8243;や&#8221;deu_deu.1252&#8243;という文字列を渡していました。これについての補足です。</p><p>答えはMSDNに載っており、<a
href="http://msdn.microsoft.com/ja-jp/library/hzz3tw78(VS.80).aspx">言語および国/地域識別文字列</a>にあります。そのページの下の<a
href="http://msdn.microsoft.com/ja-jp/library/39cwe7zf(VS.80).aspx">言語識別文字列</a>と<a
href="http://msdn.microsoft.com/ja-jp/library/cdax410z(VS.80).aspx">国/地域識別文字列</a>でjpnやdeuが見つけられます。たとえば、言語識別文字列で「日本語」の欄には「&#8221;japanese&#8221; または &#8220;jpn&#8221;」と書いてあります。<a
href="http://ja.wikipedia.org/wiki/Microsoft%E3%82%B3%E3%83%BC%E3%83%89%E3%83%9A%E3%83%BC%E3%82%B8932">932</a>や<a
href="http://ja.wikipedia.org/wiki/Windows-1252">1252</a>はもちろんWindowsコードページです。</p><p>つまり、&#8221;jpn_jpn.932&#8243;と&#8221;deu_deu.1252&#8243;をUnix風に書けば、それぞれ&#8221;ja_JP.SJIS&#8221;と&#8221;de_DE.ISO-8859-1&#8243;となると言うわけです。</p><p>なお、よくstd::locale(&#8220;japanese&#8221;)という記述を見かけますが、これも一応間違ってはいないです。先ほどのMSDNライブラリの<a
href="http://msdn.microsoft.com/ja-jp/library/x99tb11d(VS.80).aspx">setlocale、_wsetlocale</a>のページに載っているように、国・地域とコードページ指定は省略可能です。</p><p>std::locale(&#8220;japanese&#8221;)は「日本語出力のため」と、おまじないのように扱われていますが、Shift_JISで表現された文字列を出力するという目的であれば、std::locale(&#8220;.932&#8243;)のほうが適切なのに、と思います……。なお、私は特に必要のない場合CP_ACPとの一貫性をとってstd::locale(&#8220;&#8221;)派ですが。</p> ]]></content:encoded> <wfw:commentRss>http://dev.activebasic.com/egtra/2011/12/30/463/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>std::to_stringはlocale指定の影響を受けるのか、またどういう書式なのか気になった</title><link>http://dev.activebasic.com/egtra/2011/12/29/460/</link> <comments>http://dev.activebasic.com/egtra/2011/12/29/460/#comments</comments> <pubDate>Thu, 29 Dec 2011 07:42:02 +0000</pubDate> <dc:creator>egtra</dc:creator> <category><![CDATA[C++]]></category> <category><![CDATA[C++11]]></category> <category><![CDATA[locale]]></category> <category><![CDATA[std::locale]]></category> <category><![CDATA[to_string]]></category> <guid
isPermaLink="false">http://dev.activebasic.com/egtra/?p=460</guid> <description><![CDATA[C++11のto_stringがどういう書式指定なのか、最終ドラフトN3290の記述を確かめ、実際の処理系（Linux/GCC 4.6.2/libstdc++とWindows/Visual C++ 2010）で試してみました。N3290ではsprintfの書式に従うと書いてあり、libstdc++は実際その通りの結果で、Visual C++は若干異なる結果でした。いずれもlocale指定の影響を受けることが分かりました。]]></description> <content:encoded><![CDATA[<p>C++11のto_string関数について調べていました。タイトルに書いたとおり、locale指定の影響と、書式の2つを知りたくなったためです。</p><p>このコードを動かしてみましょう。これは、Linux上のGCC 4.6.2 (glibc + libstdc++)で動かしました。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;string&gt;</span>
<span style="color: #339900;">#include &lt;locale&gt;</span>
<span style="color: #339900;">#include &lt;clocale&gt;</span>
<span style="color: #339900;">#include &lt;cstdio&gt;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">double</span> x <span style="color: #000080;">=</span> <span style="color:#800080;">1234.56</span><span style="color: #008080;">;</span>
&nbsp;
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span>.<span style="color: #007788;">imbue</span><span style="color: #008000;">&#40;</span>std<span style="color: #008080;">::</span><span style="color: #007788;">locale</span><span style="color: #008080;">::</span><span style="color: #007788;">classic</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #007788;">setlocale</span><span style="color: #008000;">&#40;</span>LC_ALL, <span style="color: #FF0000;">&quot;C&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;C:<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">'<span style="color: #000099; font-weight: bold;">\t</span>'</span> <span style="color: #000080;">&lt;&lt;</span> x <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">'<span style="color: #000099; font-weight: bold;">\t</span>'</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">to_string</span><span style="color: #008000;">&#40;</span>x<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>%f<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, x<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span>.<span style="color: #007788;">imbue</span><span style="color: #008000;">&#40;</span>std<span style="color: #008080;">::</span><span style="color: #007788;">locale</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;ja_JP.UTF-8&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #007788;">setlocale</span><span style="color: #008000;">&#40;</span>LC_ALL, <span style="color: #FF0000;">&quot;ja_JP.UTF-8&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;ja_JP.UTF-8:<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">'<span style="color: #000099; font-weight: bold;">\t</span>'</span> <span style="color: #000080;">&lt;&lt;</span> x <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">'<span style="color: #000099; font-weight: bold;">\t</span>'</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">to_string</span><span style="color: #008000;">&#40;</span>x<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>%f<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, x<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span>.<span style="color: #007788;">imbue</span><span style="color: #008000;">&#40;</span>std<span style="color: #008080;">::</span><span style="color: #007788;">locale</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;de_DE.UTF-8&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #007788;">setlocale</span><span style="color: #008000;">&#40;</span>LC_ALL, <span style="color: #FF0000;">&quot;de_DE.UTF-8&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;de_DE.UTF-8:<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">'<span style="color: #000099; font-weight: bold;">\t</span>'</span> <span style="color: #000080;">&lt;&lt;</span> x <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">'<span style="color: #000099; font-weight: bold;">\t</span>'</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">to_string</span><span style="color: #008000;">&#40;</span>x<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>%f<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, x<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><p>こっちは、Windows上のVisual C++ 2010です。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;string&gt;</span>
<span style="color: #339900;">#include &lt;locale&gt;</span>
<span style="color: #339900;">#include &lt;clocale&gt;</span>
<span style="color: #339900;">#include &lt;cstdio&gt;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">long</span> <span style="color: #0000ff;">double</span> x <span style="color: #000080;">=</span> <span style="color:#800080;">1234.56</span><span style="color: #008080;">;</span>
&nbsp;
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span>.<span style="color: #007788;">imbue</span><span style="color: #008000;">&#40;</span>std<span style="color: #008080;">::</span><span style="color: #007788;">locale</span><span style="color: #008080;">::</span><span style="color: #007788;">classic</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #007788;">setlocale</span><span style="color: #008000;">&#40;</span>LC_ALL, <span style="color: #FF0000;">&quot;C&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;C:<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">'<span style="color: #000099; font-weight: bold;">\t</span>'</span> <span style="color: #000080;">&lt;&lt;</span> x <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">'<span style="color: #000099; font-weight: bold;">\t</span>'</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">to_string</span><span style="color: #008000;">&#40;</span>x<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>%f<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, x<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span>.<span style="color: #007788;">imbue</span><span style="color: #008000;">&#40;</span>std<span style="color: #008080;">::</span><span style="color: #007788;">locale</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;jpn_jpn.932&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #007788;">setlocale</span><span style="color: #008000;">&#40;</span>LC_ALL, <span style="color: #FF0000;">&quot;jpn_jpn.932&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;jpn_jpn.932:<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">'<span style="color: #000099; font-weight: bold;">\t</span>'</span> <span style="color: #000080;">&lt;&lt;</span> x <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">'<span style="color: #000099; font-weight: bold;">\t</span>'</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">to_string</span><span style="color: #008000;">&#40;</span>x<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>%f<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, x<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span>.<span style="color: #007788;">imbue</span><span style="color: #008000;">&#40;</span>std<span style="color: #008080;">::</span><span style="color: #007788;">locale</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;deu_deu.1252&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #007788;">setlocale</span><span style="color: #008000;">&#40;</span>LC_ALL, <span style="color: #FF0000;">&quot;deu_deu.1252&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;deu_deu.1252:<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">'<span style="color: #000099; font-weight: bold;">\t</span>'</span> <span style="color: #000080;">&lt;&lt;</span> x <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">'<span style="color: #000099; font-weight: bold;">\t</span>'</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">to_string</span><span style="color: #008000;">&#40;</span>x<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>%f<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, x<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><p>なお、VC++版でlong doubleを使っている理由は、Visual C++ 2010の実装が不完全なためです（参考: <a
href="http://connect.microsoft.com/VisualStudio/feedback/details/576750/c-0x-std-to-string-is-non-conforming">[C++0X] std::to_string is non conforming | Microsoft Connect</a>）。</p><p>de_DE/deu_deuは、Cやja_JP/jpn_jpnと小数点・桁区切りの記号が異なるロケールの代表例として選びました。</p><p>実行結果はそれぞれこうなりました。まずはLinux/GCC/libstdc++版です。</p><pre>C:
        1234.56
        1234.560000
        1234.560000
ja_JP.UTF-8:
        1,234.56
        1234.560000
        1234.560000
de_DE.UTF-8:
        1.234,56
        1234,560000
        1234,560000</pre><p>続いて、Visual C++版です。</p><pre>C:
        1234.56
        1234.56
        1234.560000
jpn_jpn.932:
        1,234.56
        1234.56
        1234.560000
deu_deu.1252:
        1.234,56
        1234,56
        1234,560000</pre><p>Visual C++はちょっと惜しいです。</p><p>printfの出力をわざわざ並べていることから分かったかもしれませんが、to_stringの結果はprintf系と同じ書式になるのが正しいようです。N3290（最終ドラフト）の21.5 Numeric conversions [string.conversions]のto_stringの欄には、型ごとにそれぞれ&#8221;%d&#8221;, &#8220;%u&#8221;, &#8220;%ld&#8221;, &#8220;%lu&#8221;, &#8220;%lld&#8221;, &#8220;%llu&#8221;, &#8220;%f&#8221;, &#8220;%f&#8221;, &#8220;%Lf&#8221;の書式でsprintfを呼んで文字列を作るというようなことが書いてあります。実は、その記述を見つけたので上記のプログラムを書いて試したという順序でした。</p><p>あとは、boost::lexical_castもついでに試しておけば良かったですね。次への課題とします。</p> ]]></content:encoded> <wfw:commentRss>http://dev.activebasic.com/egtra/2011/12/29/460/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>DoxygenのLaTeX出力で日本語を使う</title><link>http://dev.activebasic.com/egtra/2011/12/25/459/</link> <comments>http://dev.activebasic.com/egtra/2011/12/25/459/#comments</comments> <pubDate>Sun, 25 Dec 2011 08:05:03 +0000</pubDate> <dc:creator>egtra</dc:creator> <category><![CDATA[雑記]]></category> <category><![CDATA[Doxygen]]></category> <category><![CDATA[sed]]></category> <category><![CDATA[TeX]]></category> <guid
isPermaLink="false">http://dev.activebasic.com/egtra/?p=459</guid> <description><![CDATA[DoxygenのLaTeX出力で、日本語を含むドキュメントを最低限文字化けせずにPDF化する方法を調べていました。その手順を書いています。]]></description> <content:encoded><![CDATA[<p>DoxygenのLaTeX出力は、普通のLaTeXもしくはpdfLaTeXを想定しており、そのままでは日本語が使えません。そのため、日本語を含むドキュメントを最低限文字化けせずにPDF化する方法を調べていました。</p><ul><li>必要なもののインストール（初回だけ）</li><li>Doxyfileの修正（プロジェクトごとに1回だけ）</li><li>Makefileとrefman.texの修正（doxygenコマンドを実行するたび）</li></ul><p>まず、以下のものが必要でした。</p><dl><dt>Doxygen</dt><dd>この記事を書いている時点での最新は1.7.6.1でした。しかし、この方法自体は1年くらい前からやり始めたので、もう少し前のバージョンでも可能だと思います。</dd><dt>pLaTeXまたはupLaTeX</dt><dd>WindowsなのでW32TeXを使っています。私は<a
href="http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%28Windows%29">インストール(Windows) &#8211; TeX Wiki</a>の「標準インストールで必要なもの」一式とuptex-w32.tar.xzを導入した状態です（OTFパッケージも入れていますが今回は使っていません）。もちろん、pLaTeXを使用するならuptex-w32.tar.xzは不要です。Unix系ならTeX Live 2011などで良いと思います</dd><dt>Cygwin</dt><dd>なくても大丈夫です。私は、Doxygenの生成するMakefileの実行にGNUのmakeを使うためと、ファイルの修正にsedを使うためにCygwinを使っています。</dd></dl><p>このほか、以下のパッケージが必要でした。Doxygenが生成するLaTeXソース内でこれらが\usepackageされています。</p><ul><li><a
href="http://www.ctan.org/tex-archive/macros/latex/contrib/listings/">listings</a></li><li><a
href="http://www.ctan.org/tex-archive/macros/latex/contrib/xcolor">xcolor</a></li></ul><hr
/><p>準備ができたら、Doxyfileの編集です。doxygen -gやDoxywizardなどで生成したDoxyfileに対して以下の2ヶ所を修正します。</p><dl><dt>LATEX_CMD_NAME</dt><dd><pre>LATEX_CMD_NAME = uplatex</pre><p>platexを使う場合は以下のようにします。その場合、OTFパッケージと<a
href="http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?OTF#u1eb9e1c">UTF-8 入力での利用 &#8211; OTF &#8211; TeX Wiki</a>にある補助プログラムの併用を考えても良いかもしれません。</p><pre>LATEX_CMD_NAME = "platex -kanji=utf8"</pre></dd><dt>USE_PDFLATEX</dt><dd><pre>USE_PDFLATEX = NO</pre><p>現在のところ、pdfLaTeXは日本語環境で使えません。そのため、NOを選択しておきます。この設定、YESでもNOでも日本語環境に適さないという点では同じですけどね。</p></dd></dl><p>このほか、もちろんGENERATE_LATEXがYESになっていなければYESにしましょう。</p><hr
/><p>ここまできたら、doxygenコマンドを実行します。ただし、これで終わりではありません。生成されたファイルに、さらに修正を加える必要があります。毎回行うのは面倒なので、適当なスクリプトにでもまとめておきましょう。</p><dd><dt>Makefileのdel</dt><dd><p>Makefileの最下行の「del /s/y ……」を「rm -f ……」に直します。ただし、Windows版以外では、この必要はないかもしれません。</p><div
class="wp_syntax"><div
class="code"><pre class="bash">$ <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-i</span> <span style="color: #ff0000;">'s|del /s/y|rm -f|'</span> Makefile</pre></div></div></dd><dt>refman.texにPDFのしおりに関する指定を追加</dt><dd><p>2行目に以下の内容を追加します。この記述内容については<a
href="http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?hyperref#za8c61cb">hyperref &#8211; TeX Wiki</a>を参考にしてください。</p><div
class="wp_syntax"><div
class="code"><pre class="latex"><span style="color: #E02020; ">\</span><span style="color: #800000;">ifx</span><span style="color: #800000; font-weight: normal;">\kanjiskip</span><span style="color: #800000; font-weight: normal;">\undefined</span><span style="color: #E02020; ">\</span><span style="color: #800000;">else</span>
  <span style="color: #E02020; ">\</span><span style="color: #800000;">usepackage</span><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;">atbegshi</span><span style="color: #E02020; ">}</span>
  <span style="color: #E02020; ">\</span><span style="color: #800000;">ifx</span><span style="color: #800000; font-weight: normal;">\ucs</span><span style="color: #800000; font-weight: normal;">\undefined</span>
    <span style="color: #800000; font-weight: normal;">\ifnum</span> 42146=<span style="color: #800000; font-weight: normal;">\euc</span>&quot;A4A2
      <span style="color: #800000; font-weight: normal;">\AtBeginShipoutFirst</span><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;"><span style="color: #800000; font-weight: normal;">\special</span>{pdf:tounicode EUC-UCS2</span><span style="color: #E02020; ">}}</span>
    <span style="color: #E02020; ">\</span><span style="color: #800000;">else</span>
      <span style="color: #800000; font-weight: normal;">\AtBeginShipoutFirst</span><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;"><span style="color: #800000; font-weight: normal;">\special</span>{pdf:tounicode 90ms-RKSJ-UCS2</span><span style="color: #E02020; ">}}</span>
    <span style="color: #E02020; ">\</span><span style="color: #800000;">fi</span>
  <span style="color: #E02020; ">\</span><span style="color: #800000;">else</span>
    <span style="color: #800000; font-weight: normal;">\AtBeginShipoutFirst</span><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;"><span style="color: #800000; font-weight: normal;">\special</span>{pdf:tounicode UTF8-UCS2</span><span style="color: #E02020; ">}}</span>
  <span style="color: #E02020; ">\</span><span style="color: #800000;">fi</span>
<span style="color: #E02020; ">\</span><span style="color: #800000;">fi</span></pre></div></div></dd><dt>refman.texでhyperrefのオプションをps2pdfからdvipdfmxに変える<dt><dd><p>ついでに、graphicsxやxcolorなどもdvipdfmxの指定を追加したほうが良いのかもしれません。</p></dd><dt>refman.texでhyperrefのオプションからunicodeを消去する</dt><dd><p>元がこうであるところ、</p><div
class="wp_syntax"><div
class="code"><pre class="latex"><span style="color: #E02020; ">\</span><span style="color: #800000;">usepackage</span><span style="color: #E02020; ">[</span><span style="color: #C08020; font-weight: normal;">dvipdfmx,
            pagebackref=true,
            colorlinks=true,
            linkcolor=blue,
            unicode
           </span><span style="color: #E02020; ">]{</span><span style="color: #2020C0; font-weight: normal;">hyperref</span><span style="color: #E02020; ">}</span></pre></div></div><p>下のように変えます。</p><div
class="wp_syntax"><div
class="code"><pre class="latex"><span style="color: #E02020; ">\</span><span style="color: #800000;">usepackage</span><span style="color: #E02020; ">[</span><span style="color: #C08020; font-weight: normal;">dvipdfmx,
            pagebackref=true,
            colorlinks=true,
            linkcolor=blue
           </span><span style="color: #E02020; ">]{</span><span style="color: #2020C0; font-weight: normal;">hyperref</span><span style="color: #E02020; ">}</span></pre></div></div></dd><dt>\usepackage{pspicture}の行を削除する</dt><dd><p>実際には使っていないらしく、削除しても特に問題ありませんでした。削除する理由は、これがあるとdvipdfmxで生成できないためです。Doxygenのバージョンが新しいと、そもそもこの行が生成されないのでこの手順は不要です。</p></dd><dt>本文をゴシック体にする</dt><dd><p>本文がサンセリフ体となっているため、そのままだと「和文：明朝体、欧文：サンセリフ体」というアンバランスな組み合わせになってしまいます。最低限の対処として、本文の和文書体をゴシック体にすることしました。\renewcommand{\kanjifamilydefault}{\gtdefault}を書き加えると良いようです（参考：<a
href="http://www.ns.cradle.titech.ac.jp/cgi-bin/fswiki/wiki.cgi?page=%A5%B9%A5%E9%A5%A4%A5%C9%A4%CA%A4%C9%A4%C7%BF%F4%BC%B0%A4%F2%A5%B5%A5%F3%A5%BB%A5%EA%A5%D5%C2%CE%A4%CB%A4%B9%A4%EB">スライドなどで数式をサンセリフ体にする &#8211; 西方研Wiki</a>）。</p></dd></dl><p>上に書いたrefman.texへの修正をsedでやるとこんな感じでしょうか。</p><pre>1a\\\ifx\\kanjiskip\\undefined\\else\
  \\usepackage{atbegshi}\
  \\ifx\\ucs\\undefined\
    \\ifnum 42146=\\euc"A4A2\
      \\AtBeginShipoutFirst{\\special{pdf:tounicode EUC-UCS2}}\
    \\else\
      \\AtBeginShipoutFirst{\\special{pdf:tounicode 90ms-RKSJ-UCS2}}\
    \\fi\
  \\else\
    \\AtBeginShipoutFirst{\\special{pdf:tounicode UTF8-UCS2}}\
  \\fi\
\\fi
s/usepackage\[ps2pdf,/usepackage[dvipdfmx,/
/unicode/d
s/linkcolor=blue,/linkcolor=blue/
/\\usepackage{pspicture}/d
1a\\\renewcommand{\\kanjifamilydefault}{\\gtdefault}</pre><p>上記内容をrefman.sedというファイル名で保存したら、以下のように実行できます。</p><div
class="wp_syntax"><div
class="code"><pre class="bash">$ <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-f</span> refman.sed <span style="color: #660033;">-i</span> refman.tex</pre></div></div><p>ここまでができたら、makeとdvipdfmxを実行します。</p><div
class="wp_syntax"><div
class="code"><pre class="bash">$ <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> dvipdfmx refman.dvi</pre></div></div><p>Cygwinがないなど、makeを使わないなら適当に(u)platexを実行すれば同じです。Makefileの中でやっていることはだいたいこんな感じです。</p><div
class="wp_syntax"><div
class="code"><pre class="bash">$ uplatex refman.tex
$ makeindex refman.idx
$ uplatex refman.tex
$ uplatex refman.tex
$ dvipdfmx refman.dvi</pre></div></div><p>platexでもだいたい同じです。</p><div
class="wp_syntax"><div
class="code"><pre class="bash">$ platex <span style="color: #660033;">-kanji</span>=utf8 refman.tex
$ makeindex refman.idx
$ platex <span style="color: #660033;">-kanji</span>=utf8 refman.tex
$ platex <span style="color: #660033;">-kanji</span>=utf8 refman.tex
$ dvipdfmx refman.dvi</pre></div></div><p>refman.texの修正の仕方は、refman.tex実物を1度見て、どう直すか考えるのが良いと思います。DoxygenのバージョンやDoxyfileでの設定によって出力が変わるので、この手順がそのまま適用できるとは限らないので。</p> ]]></content:encoded> <wfw:commentRss>http://dev.activebasic.com/egtra/2011/12/25/459/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Boost.Fusionを使ってライブラリを書く</title><link>http://dev.activebasic.com/egtra/2011/12/18/457/</link> <comments>http://dev.activebasic.com/egtra/2011/12/18/457/#comments</comments> <pubDate>Sat, 17 Dec 2011 19:50:47 +0000</pubDate> <dc:creator>egtra</dc:creator> <category><![CDATA[C++]]></category> <category><![CDATA[Boost.Fusion]]></category> <category><![CDATA[Boost.ResultOf]]></category> <category><![CDATA[boost::disable_if]]></category> <category><![CDATA[boost::enable_if]]></category> <category><![CDATA[boost::fusion::front]]></category> <category><![CDATA[boost::fusion::invoke]]></category> <category><![CDATA[boost::fusion::pop_front]]></category> <category><![CDATA[boost::fusion::transform]]></category> <category><![CDATA[boost::mpl::empty]]></category> <category><![CDATA[boost::remove_reference]]></category> <category><![CDATA[C++11]]></category> <guid
isPermaLink="false">http://dev.activebasic.com/egtra/?p=457</guid> <description><![CDATA[本記事は、Boost Advent Calendar 2011の17日目の記事です。 きっかけは、「bind（BoostやTR1やC++11にあるやつ）を書いてみよう」と思い立ったことでした。 常日頃から&#8221;s [...]]]></description> <content:encoded><![CDATA[<p>本記事は、<a
href="http://partake.in/events/597a0fc3-0e3a-47a3-8fc3-4f32ad846a3d">Boost Advent Calendar 2011</a>の17日目の記事です。</p><hr
/><p>きっかけは、「bind（BoostやTR1やC++11にあるやつ）を書いてみよう」と思い立ったことでした。</p><p>常日頃から&#8221;shared_ptr&#8221;, &#8220;function&#8221;, &#8220;bind&#8221;が三種の神器であると考えている私ですが、今までbindだけは自分で作ったことがなく、また作り方も分からなかったのです。そのためBoost/TR1/C++11なしの縛りでコードを書く際は、std::bind1st/bind2ndが適用できるよう落とし込むか、その都度関数オブジェクトを作る羽目になっていました。</p><p>しかし、最近ようやく1つのやり方を思い付きました（mem_fn相当を自動でやってくれる機能は本筋ではないので省略しています）。ちなみに、未だにBoost.Bindのソースコードは見たことがありません。</p><ol><li>Bind関数では、引数リストをタプルに保管したbinderオブジェクトを返す（bind(f, foo, _1, bar, _2)なら{foo, _1, bar}というタプルにする）。</li><li><p>operator ()では次のことを行う。</p><ol><li>binderのタプルから_1（プレースホルダ）に1番目の引数を当てはめたタプルを作る。</li><li>上のタプルから_2に2番目の引数を当てはめたタプルを作る。</li><li>「上の_NにN番目の引数を当てはめたタプルを作る」を引数が尽きるまで繰り返す</li><li>上のタプルを引数並びとして関数を呼び出す。</li></ol></li></ol><p>「タプルを操作する」といえばBoost.Fusionです。とりあえずFusionを使って、上記のようなプログラムが書けることを試すことにしました。ここまで、前書きでした。今回の話にはbindを作ること自体は特に関係ありません。</p><hr/><p>Boost.Fusionを使ってライブラリを作るということは、戻り値の型を書くこととの戦いと言っても過言ではありません。これが今日の本題です。</p><p>そのbindを書いていて次のようなコードが出てきました。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span>
  std<span style="color: #008080;">::</span><span style="color: #0000ff;">size_t</span> N,
  <span style="color: #0000ff;">typename</span> ArgsSequence,
  <span style="color: #0000ff;">typename</span> Args2Sequence,
  <span style="color: #0000ff;">typename</span> boost<span style="color: #008080;">::</span><span style="color: #007788;">enable_if</span><span style="color: #000080;">&lt;</span>
    <span style="color: #0000ff;">typename</span> mpl<span style="color: #008080;">::</span><span style="color: #007788;">empty</span><span style="color: #000080;">&lt;</span>Args2Sequence<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span><span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span><span style="color: #000040;">*</span><span style="color: #000040;">&amp;</span> <span style="color: #000080;">=</span> enabler<span style="color: #000080;">&gt;</span>
<span style="color: #008000;">&#40;</span>……<span style="color: #008000;">&#41;</span>
invokeN<span style="color: #008000;">&#40;</span>ArgsSequence <span style="color: #0000ff;">const</span><span style="color: #000040;">&amp;</span> s, Args2Sequence <span style="color: #0000ff;">const</span><span style="color: #000040;">&amp;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">return</span> fusion<span style="color: #008080;">::</span><span style="color: #007788;">invoke</span><span style="color: #008000;">&#40;</span>m_f, s<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><p><a
href="http://www.boost.org/doc/libs/release/libs/fusion/doc/html/fusion/functional/invocation/functions/invoke.html">fusion::invoke</a>は「タプル(Fusion Sequence)を引数並びとして関数を呼び出す」を実現してくれるものです。さて、invokeNメンバ関数の戻り値の型、(……)には何を当てはめればよいでしょうか。すなわち、このfusion::invokeはどんな型を返すのでしょうか。もちろん、C++11ならdecltypeが使えます（注意：以下のコードは実際にはコンパイルエラーになります）。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span>
  std<span style="color: #008080;">::</span><span style="color: #0000ff;">size_t</span> N,
  <span style="color: #0000ff;">typename</span> ArgsSequence,
  <span style="color: #0000ff;">typename</span> Args2Sequence,
  <span style="color: #0000ff;">typename</span> boost<span style="color: #008080;">::</span><span style="color: #007788;">enable_if</span><span style="color: #000080;">&lt;</span>
    <span style="color: #0000ff;">typename</span> mpl<span style="color: #008080;">::</span><span style="color: #007788;">empty</span><span style="color: #000080;">&lt;</span>Args2Sequence<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span><span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span><span style="color: #000040;">*</span><span style="color: #000040;">&amp;</span> <span style="color: #000080;">=</span> enabler<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">auto</span> invokeN<span style="color: #008000;">&#40;</span>ArgsSequence <span style="color: #0000ff;">const</span><span style="color: #000040;">&amp;</span> s, Args2Sequence <span style="color: #0000ff;">const</span><span style="color: #000040;">&amp;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span>
  <span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span> decltype<span style="color: #008000;">&#40;</span>fusion<span style="color: #008080;">::</span><span style="color: #007788;">invoke</span><span style="color: #008000;">&#40;</span>m_f, s<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">return</span> fusion<span style="color: #008080;">::</span><span style="color: #007788;">invoke</span><span style="color: #008000;">&#40;</span>m_f, s<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><p>しかし、decltypeのないC++03ではどうしましょう？この問題に立ち向かっているのが、Boost.Fusionのもう1つの顔なのです。</p><p>基本的には、戻り値の型を別手段で提供しています。もう1度fusion::invokeの公式のページを見てみましょう：<a
href="http://www.boost.org/doc/libs/release/libs/fusion/doc/html/fusion/functional/invocation/functions/invoke.html">infoke</a>。</p><blockquote><p>Synopsis</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span>
    <span style="color: #0000ff;">typename</span> Function,
    <span style="color: #0000ff;">class</span> Sequence
    <span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">typename</span> result_of<span style="color: #008080;">::</span><span style="color: #007788;">invoke</span><span style="color: #000080;">&lt;</span>Function, Sequence<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span>
invoke<span style="color: #008000;">&#40;</span>Function f, Sequence <span style="color: #000040;">&amp;</span> s<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span>
    <span style="color: #0000ff;">typename</span> Function,
    <span style="color: #0000ff;">class</span> Sequence
    <span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">typename</span> result_of<span style="color: #008080;">::</span><span style="color: #007788;">invoke</span><span style="color: #000080;">&lt;</span>Function, Sequence <span style="color: #0000ff;">const</span><span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span>
invoke<span style="color: #008000;">&#40;</span>Function f, Sequence <span style="color: #0000ff;">const</span> <span style="color: #000040;">&amp;</span> s<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></div></div></blockquote><p>戻り値の型はtypename result_of::invoke&lt;……&gt;::typeとして宣言されています。そう、これがミソなのです。</p><p>Boost.Fusionにあるすべての関数は、boost::fusion::result_of::(関数名)&lt;関数の引数の型&gt;::typeというメタ関数呼出で戻り値の型が取得できるようになっているのです。</p><p>そうと分かれば簡単です。M_fの型はFunctorであるとして、次のように書けば良いのです。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span>
  std<span style="color: #008080;">::</span><span style="color: #0000ff;">size_t</span> N,
  <span style="color: #0000ff;">typename</span> ArgsSequence,
  <span style="color: #0000ff;">typename</span> Args2Sequence,
  <span style="color: #0000ff;">typename</span> boost<span style="color: #008080;">::</span><span style="color: #007788;">enable_if</span><span style="color: #000080;">&lt;</span>
    <span style="color: #0000ff;">typename</span> mpl<span style="color: #008080;">::</span><span style="color: #007788;">empty</span><span style="color: #000080;">&lt;</span>Args2Sequence<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span><span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span><span style="color: #000040;">*</span><span style="color: #000040;">&amp;</span> <span style="color: #000080;">=</span> enabler<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">typename</span> fusion<span style="color: #008080;">::</span><span style="color: #007788;">result_of</span><span style="color: #008080;">::</span><span style="color: #007788;">invoke</span><span style="color: #000080;">&lt;</span>Functor, ArgsSequence<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span>
invokeN<span style="color: #008000;">&#40;</span>ArgsSequence <span style="color: #0000ff;">const</span><span style="color: #000040;">&amp;</span> s, Args2Sequence <span style="color: #0000ff;">const</span><span style="color: #000040;">&amp;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">return</span> fusion<span style="color: #008080;">::</span><span style="color: #007788;">invoke</span><span style="color: #008000;">&#40;</span>m_f, s<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><p>先ほどの(……)に果てはまる答えは、typename fusion::result_of::invoke&lt;Functor, ArgsSequence&gt;::typeでした。</p><p>ただし、これで完成にしてはいけません。このinvokeN関数の戻り値の型の取得手段も、やはり提供しましょう。ただ、fusionほど厳密にやらないことにします（invokeNは外部に公開する関数という位置づけではないからです）。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">typename</span> ArgsSequence<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">struct</span> invoke0_result <span style="color: #008080;">:</span>
  fusion<span style="color: #008080;">::</span><span style="color: #007788;">result_of</span><span style="color: #008080;">::</span><span style="color: #007788;">invoke</span><span style="color: #000080;">&lt;</span>Functor, ArgsSequence<span style="color: #000080;">&gt;</span>
<span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></div></div><p>ArgsSequenceさえ分かれば決定できるということで、それだけしか引数にしていません。名前もresult::invokeNとしていません。</p><p>これを使って先ほどの例は次のように直します。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span>
  std<span style="color: #008080;">::</span><span style="color: #0000ff;">size_t</span> N,
  <span style="color: #0000ff;">typename</span> ArgsSequence,
  <span style="color: #0000ff;">typename</span> Args2Sequence,
  <span style="color: #0000ff;">typename</span> boost<span style="color: #008080;">::</span><span style="color: #007788;">enable_if</span><span style="color: #000080;">&lt;</span>
    <span style="color: #0000ff;">typename</span> mpl<span style="color: #008080;">::</span><span style="color: #007788;">empty</span><span style="color: #000080;">&lt;</span>Args2Sequence<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span><span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span><span style="color: #000040;">*</span><span style="color: #000040;">&amp;</span> <span style="color: #000080;">=</span> enabler<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">typename</span> invoke0_result<span style="color: #000080;">&lt;</span>ArgsSequence<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span>
invokeN<span style="color: #008000;">&#40;</span>ArgsSequence <span style="color: #0000ff;">const</span><span style="color: #000040;">&amp;</span> s, Args2Sequence <span style="color: #0000ff;">const</span><span style="color: #000040;">&amp;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">return</span> fusion<span style="color: #008080;">::</span><span style="color: #007788;">invoke</span><span style="color: #008000;">&#40;</span>m_f, s<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><p>では、次の例にいってみましょう。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span>
  std<span style="color: #008080;">::</span><span style="color: #0000ff;">size_t</span> N,
  <span style="color: #0000ff;">typename</span> ArgsSequence,
  <span style="color: #0000ff;">typename</span> Args2Sequence,
  <span style="color: #0000ff;">typename</span> boost<span style="color: #008080;">::</span><span style="color: #007788;">disable_if</span><span style="color: #000080;">&lt;</span>
    <span style="color: #0000ff;">typename</span> mpl<span style="color: #008080;">::</span><span style="color: #007788;">empty</span><span style="color: #000080;">&lt;</span>Args2Sequence<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span><span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span><span style="color: #000040;">*</span><span style="color: #000040;">&amp;</span> <span style="color: #000080;">=</span> enabler<span style="color: #000080;">&gt;</span>
<span style="color: #008000;">&#40;</span>戻り値の型<span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span>
invokeN<span style="color: #008000;">&#40;</span>ArgsSequence <span style="color: #0000ff;">const</span><span style="color: #000040;">&amp;</span> s, Args2Sequence <span style="color: #0000ff;">const</span><span style="color: #000040;">&amp;</span> args2<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">typedef</span> <span style="color: #0000ff;">typename</span> boost<span style="color: #008080;">::</span><span style="color: #007788;">remove_reference</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">typename</span> fusion<span style="color: #008080;">::</span><span style="color: #007788;">result_of</span><span style="color: #008080;">::</span><span style="color: #007788;">front</span><span style="color: #000080;">&lt;</span>Args2Sequence<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span><span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span> front_type<span style="color: #008080;">;</span>
  <span style="color: #0000ff;">return</span> this<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>invokeN<span style="color: #000080;">&lt;</span>N <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #000080;">&gt;</span><span style="color: #008000;">&#40;</span>
    fusion<span style="color: #008080;">::</span><span style="color: #007788;">transform</span><span style="color: #008000;">&#40;</span>s, replace<span style="color: #000080;">&lt;</span>placeholder<span style="color: #000080;">&lt;</span>N<span style="color: #000080;">&gt;</span>, front_type<span style="color: #000080;">&gt;</span><span style="color: #008000;">&#123;</span>fusion<span style="color: #008080;">::</span><span style="color: #007788;">front</span><span style="color: #008000;">&#40;</span>args2<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span>,
    fusion<span style="color: #008080;">::</span><span style="color: #007788;">pop_front</span><span style="color: #008000;">&#40;</span>args2<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><p>(戻り値の型2)はどう書いたら良いでしょうか。関数の中身はさっきより複雑です。</p><p>今度は、初めから戻り値型を得るメタ関数から作ることにします。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span>
  std<span style="color: #008080;">::</span><span style="color: #0000ff;">size_t</span> N,
  <span style="color: #0000ff;">typename</span> ArgsSequence,
  <span style="color: #0000ff;">typename</span> Args2Sequence<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">struct</span> invokeN_result <span style="color: #008080;">:</span>
  <span style="color: #008000;">&#40;</span>何か<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></div></div><p>さてお気づきかもしれませんが、最初の例の関数と今度の例の関数、同じ名前です。enable_ifとdisable_ifで切り替えているのです。Args2Sequenceが長さ0なら最初の関数、そうでなければ、こっちの関数を使うよう分岐させていました。なので、それを表現します。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span>
  std<span style="color: #008080;">::</span><span style="color: #0000ff;">size_t</span> N,
  <span style="color: #0000ff;">typename</span> ArgsSequence,
  <span style="color: #0000ff;">typename</span> Args2Sequence<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">struct</span> invokeN_result <span style="color: #008080;">:</span>
  mpl<span style="color: #008080;">::</span><span style="color: #007788;">eval_if</span><span style="color: #000080;">&lt;</span>
    <span style="color: #0000ff;">typename</span> mpl<span style="color: #008080;">::</span><span style="color: #007788;">empty</span><span style="color: #000080;">&lt;</span>Args2Sequence<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span>,
    invoke0_result<span style="color: #000080;">&lt;</span>ArgsSequence<span style="color: #000080;">&gt;</span>,
    <span style="color: #008000;">&#40;</span>こっちのinvokeNが返す型<span style="color: #008000;">&#41;</span>
  <span style="color: #000080;">&gt;</span>
<span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></div></div><p>Mpl::eval_ifの条件はenable_if/disable_ifの条件をそのまま持ってきました。そして真の場合は先ほどのinvoke0_resultがさっそく登場です。そう、このinvokeN_resultは、今度のinvokeNだけでなく、最初のinvokeNにも対応した「invokeNの戻り値を表すメタ関数」に変貌したのです。</p><p>invokeNの中身を見てみましょう。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #0000ff;">return</span> this<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>invokeN<span style="color: #000080;">&lt;</span>N <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #000080;">&gt;</span><span style="color: #008000;">&#40;</span></pre></div></div><p>そう、再帰呼出です。なので、invokeNの戻り値の型を知るには「invokeNの戻り値を表すメタ関数」が必要という状況に陥っていたのです。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span>
  std<span style="color: #008080;">::</span><span style="color: #0000ff;">size_t</span> N,
  <span style="color: #0000ff;">typename</span> ArgsSequence,
  <span style="color: #0000ff;">typename</span> Args2Sequence<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">struct</span> invokeN_result <span style="color: #008080;">:</span>
  mpl<span style="color: #008080;">::</span><span style="color: #007788;">eval_if</span><span style="color: #000080;">&lt;</span>
    <span style="color: #0000ff;">typename</span> mpl<span style="color: #008080;">::</span><span style="color: #007788;">empty</span><span style="color: #000080;">&lt;</span>Args2Sequence<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span>,
    invoke0_result<span style="color: #000080;">&lt;</span>ArgsSequence<span style="color: #000080;">&gt;</span>,
    invokeN_result<span style="color: #000080;">&lt;</span>
      N <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span>,
      <span style="color: #008000;">&#40;</span>……<span style="color: #008000;">&#41;</span>,
      <span style="color: #008000;">&#40;</span>……<span style="color: #008000;">&#41;</span>,
    <span style="color: #000080;">&gt;</span>
  <span style="color: #000080;">&gt;</span>
<span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></div></div><p>というわけで、さっそくそこを埋めました。invokeN_resultは3つ引数を取るメタ関数なので、残り2つが問題です。再びinvokeN内を見ていきましょう。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span>
  std<span style="color: #008080;">::</span><span style="color: #0000ff;">size_t</span> N,
  <span style="color: #0000ff;">typename</span> ArgsSequence,
  <span style="color: #0000ff;">typename</span> Args2Sequence<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">return</span> this<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>invokeN<span style="color: #000080;">&lt;</span>N <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #000080;">&gt;</span><span style="color: #008000;">&#40;</span>
  fusion<span style="color: #008080;">::</span><span style="color: #007788;">transform</span><span style="color: #008000;">&#40;</span>s, replace<span style="color: #000080;">&lt;</span>placeholder<span style="color: #000080;">&lt;</span>N<span style="color: #000080;">&gt;</span>, front_type<span style="color: #000080;">&gt;</span><span style="color: #008000;">&#123;</span>fusion<span style="color: #008080;">::</span><span style="color: #007788;">front</span><span style="color: #008000;">&#40;</span>args2<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span>,
  fusion<span style="color: #008080;">::</span><span style="color: #007788;">pop_front</span><span style="color: #008000;">&#40;</span>args2<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></div></div><p>では、1つ目の引数、Fusion::transformです。Sの型はArgsSequenceです。さっそく書き込みます。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span>
  std<span style="color: #008080;">::</span><span style="color: #0000ff;">size_t</span> N,
  <span style="color: #0000ff;">typename</span> ArgsSequence,
  <span style="color: #0000ff;">typename</span> Args2Sequence<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">struct</span> invokeN_result <span style="color: #008080;">:</span>
  mpl<span style="color: #008080;">::</span><span style="color: #007788;">eval_if</span><span style="color: #000080;">&lt;</span>
    <span style="color: #0000ff;">typename</span> mpl<span style="color: #008080;">::</span><span style="color: #007788;">empty</span><span style="color: #000080;">&lt;</span>Args2Sequence<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span>,
    invoke0_result<span style="color: #000080;">&lt;</span>ArgsSequence<span style="color: #000080;">&gt;</span>,
    invokeN_result<span style="color: #000080;">&lt;</span>
      N <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span>,
      <span style="color: #0000ff;">typename</span> fusion<span style="color: #008080;">::</span><span style="color: #007788;">result_of</span><span style="color: #008080;">::</span><span style="color: #007788;">transform</span><span style="color: #000080;">&lt;</span>
        ArgsSequence,
        <span style="color: #008000;">&#40;</span>……<span style="color: #008000;">&#41;</span>
      <span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span>,
      <span style="color: #008000;">&#40;</span>……<span style="color: #008000;">&#41;</span>
    <span style="color: #000080;">&gt;</span>
  <span style="color: #000080;">&gt;</span>
<span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></div></div><p>ここのFusion::transformの2つ目の引数replace&lt;placeholder&lt;N&gt;, front_type&gt;{fusion::front(args2)}は、replace&lt;placeholder&lt;N&gt;, front_type&gt;型の一時オブジェクトを作りfusion::front(args2)で初期化という式です（C++11の初期化構文を使用）。なので、fusion::front(args2)は知らなくても大丈夫です（とは言え、実際にはfront_typeなのですけどね）。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span>
  std<span style="color: #008080;">::</span><span style="color: #0000ff;">size_t</span> N,
  <span style="color: #0000ff;">typename</span> ArgsSequence,
  <span style="color: #0000ff;">typename</span> Args2Sequence<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">struct</span> invokeN_result <span style="color: #008080;">:</span>
  mpl<span style="color: #008080;">::</span><span style="color: #007788;">eval_if</span><span style="color: #000080;">&lt;</span>
    <span style="color: #0000ff;">typename</span> mpl<span style="color: #008080;">::</span><span style="color: #007788;">empty</span><span style="color: #000080;">&lt;</span>Args2Sequence<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span>,
    invoke0_result<span style="color: #000080;">&lt;</span>ArgsSequence<span style="color: #000080;">&gt;</span>,
    invokeN_result<span style="color: #000080;">&lt;</span>
      N <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span>,
      <span style="color: #0000ff;">typename</span> fusion<span style="color: #008080;">::</span><span style="color: #007788;">result_of</span><span style="color: #008080;">::</span><span style="color: #007788;">transform</span><span style="color: #000080;">&lt;</span>
        ArgsSequence,
        replace<span style="color: #000080;">&lt;</span>placeholder<span style="color: #000080;">&lt;</span>N<span style="color: #000080;">&gt;</span>, front_type<span style="color: #000080;">&gt;</span>
      <span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span>,
      <span style="color: #008000;">&#40;</span>……<span style="color: #008000;">&#41;</span>
    <span style="color: #000080;">&gt;</span>
  <span style="color: #000080;">&gt;</span>
<span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></div></div><p>さて、これで良いと思ったらそれは早とちりです。front_typeはinvokeN内のtypedefだったのでここでは参照できません。front_typeの定義を見て直接書き込むことにします。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span>
  std<span style="color: #008080;">::</span><span style="color: #0000ff;">size_t</span> N,
  <span style="color: #0000ff;">typename</span> ArgsSequence,
  <span style="color: #0000ff;">typename</span> Args2Sequence<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">struct</span> invokeN_result <span style="color: #008080;">:</span>
  mpl<span style="color: #008080;">::</span><span style="color: #007788;">eval_if</span><span style="color: #000080;">&lt;</span>
    <span style="color: #0000ff;">typename</span> mpl<span style="color: #008080;">::</span><span style="color: #007788;">empty</span><span style="color: #000080;">&lt;</span>Args2Sequence<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span>,
    invoke0_result<span style="color: #000080;">&lt;</span>ArgsSequence<span style="color: #000080;">&gt;</span>,
    invokeN_result<span style="color: #000080;">&lt;</span>
      N <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span>,
      <span style="color: #0000ff;">typename</span> fusion<span style="color: #008080;">::</span><span style="color: #007788;">result_of</span><span style="color: #008080;">::</span><span style="color: #007788;">transform</span><span style="color: #000080;">&lt;</span>
        ArgsSequence,
        replace<span style="color: #000080;">&lt;</span>
          placeholder<span style="color: #000080;">&lt;</span>N<span style="color: #000080;">&gt;</span>,
          <span style="color: #0000ff;">typename</span> boost<span style="color: #008080;">::</span><span style="color: #007788;">remove_reference</span><span style="color: #000080;">&lt;</span>
            <span style="color: #0000ff;">typename</span> fusion<span style="color: #008080;">::</span><span style="color: #007788;">result_of</span><span style="color: #008080;">::</span><span style="color: #007788;">front</span><span style="color: #000080;">&lt;</span>Args2Sequence<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span>
          <span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span>
        <span style="color: #000080;">&gt;</span>
      <span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span>,
      <span style="color: #008000;">&#40;</span>……<span style="color: #008000;">&#41;</span>
    <span style="color: #000080;">&gt;</span>
  <span style="color: #000080;">&gt;</span>
<span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></div></div><p>残った(……)に対応するのは、fusion::pop_front(args2)です。もう分かりましたね。fusion::result_of::pop_frontを使います。これでinvokeN_resultが完成しました。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span>
  std<span style="color: #008080;">::</span><span style="color: #0000ff;">size_t</span> N,
  <span style="color: #0000ff;">typename</span> ArgsSequence,
  <span style="color: #0000ff;">typename</span> Args2Sequence<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">struct</span> invokeN_result <span style="color: #008080;">:</span>
  mpl<span style="color: #008080;">::</span><span style="color: #007788;">eval_if</span><span style="color: #000080;">&lt;</span>
    <span style="color: #0000ff;">typename</span> mpl<span style="color: #008080;">::</span><span style="color: #007788;">empty</span><span style="color: #000080;">&lt;</span>Args2Sequence<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span>,
    invoke0_result<span style="color: #000080;">&lt;</span>ArgsSequence<span style="color: #000080;">&gt;</span>,
    invokeN_result<span style="color: #000080;">&lt;</span>
      N <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span>,
      <span style="color: #0000ff;">typename</span> fusion<span style="color: #008080;">::</span><span style="color: #007788;">result_of</span><span style="color: #008080;">::</span><span style="color: #007788;">transform</span><span style="color: #000080;">&lt;</span>
        ArgsSequence,
        replace<span style="color: #000080;">&lt;</span>
          placeholder<span style="color: #000080;">&lt;</span>N<span style="color: #000080;">&gt;</span>,
          <span style="color: #0000ff;">typename</span> boost<span style="color: #008080;">::</span><span style="color: #007788;">remove_reference</span><span style="color: #000080;">&lt;</span>
            <span style="color: #0000ff;">typename</span> fusion<span style="color: #008080;">::</span><span style="color: #007788;">result_of</span><span style="color: #008080;">::</span><span style="color: #007788;">front</span><span style="color: #000080;">&lt;</span>Args2Sequence<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span>
          <span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span>
        <span style="color: #000080;">&gt;</span>
      <span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span>,
      <span style="color: #0000ff;">typename</span> fusion<span style="color: #008080;">::</span><span style="color: #007788;">result_of</span><span style="color: #008080;">::</span><span style="color: #007788;">pop_front</span><span style="color: #000080;">&lt;</span>Args2Sequence<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span>
    <span style="color: #000080;">&gt;</span>
  <span style="color: #000080;">&gt;</span>
<span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></div></div><p>これを使って今度のinvokeNは次のような戻り値の型を書けば良いのです。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span>
  std<span style="color: #008080;">::</span><span style="color: #0000ff;">size_t</span> N,
  <span style="color: #0000ff;">typename</span> ArgsSequence,
  <span style="color: #0000ff;">typename</span> Args2Sequence,
  <span style="color: #0000ff;">typename</span> boost<span style="color: #008080;">::</span><span style="color: #007788;">disable_if</span><span style="color: #000080;">&lt;</span>
    <span style="color: #0000ff;">typename</span> mpl<span style="color: #008080;">::</span><span style="color: #007788;">empty</span><span style="color: #000080;">&lt;</span>Args2Sequence<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span><span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span><span style="color: #000040;">*</span><span style="color: #000040;">&amp;</span> <span style="color: #000080;">=</span> enabler<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">typename</span> invokeN_result<span style="color: #000080;">&lt;</span>N, ArgsSequence, Args2Sequence<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span>
invokeN<span style="color: #008000;">&#40;</span>ArgsSequence <span style="color: #0000ff;">const</span><span style="color: #000040;">&amp;</span> s, Args2Sequence <span style="color: #0000ff;">const</span><span style="color: #000040;">&amp;</span> args2<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span></pre></div></div><p><strong>結論</strong>です。</p><ul><li>戻り値の型は、Return文の内容と一対一で対応（マッピング）させながら、戻り値の型を取得するメタ関数呼出を記述していけば出来上がる。</li><li>自らの作った関数についても、戻り値の型を取得するメタ関数を定義する。</li><p>実は、Boost.Fusionを使う場合に限らず、C++11のdecltypeを使わない<a
href="http://www.kmonos.net/alang/boost/classes/result_of.html">Boost.ResultOf</a>を使ったり、それに対応（サポート）する場合のクラステンプレートresultを作ったりする場合もこの考えで大丈夫です。むしろ、今回の話はBoost.FusionよりもBoost.ResultOfを題に冠すべき記事だったのです。ResultOfさん、ごめんなさい。</p><p>では、最後に今日のソースコード全体へのリンクを張っておしまいにします：<a
href="/egtra/download/bind-fusion-1.cpp">bind-fusion-1.cpp</a>。g++ 4.6.2でコンパイルしていました。</p> ]]></content:encoded> <wfw:commentRss>http://dev.activebasic.com/egtra/2011/12/18/457/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>JScript 5.8をJScript 5.8モードで動かす</title><link>http://dev.activebasic.com/egtra/2011/12/14/456/</link> <comments>http://dev.activebasic.com/egtra/2011/12/14/456/#comments</comments> <pubDate>Wed, 14 Dec 2011 14:59:22 +0000</pubDate> <dc:creator>egtra</dc:creator> <category><![CDATA[C++]]></category> <category><![CDATA[COM]]></category> <category><![CDATA[WinAPI]]></category> <category><![CDATA[ActiveScript]]></category> <category><![CDATA[boost::implicit_cast]]></category> <category><![CDATA[IActiveScript]]></category> <category><![CDATA[IActiveScriptProperty]]></category> <category><![CDATA[JavaScript]]></category> <category><![CDATA[SCRIPTLANGUAGEVERSION_5_8]]></category> <category><![CDATA[SCRIPTPROP_INVOKEVERSIONING]]></category> <category><![CDATA[_variant_t]]></category> <guid
isPermaLink="false">http://dev.activebasic.com/egtra/?p=456</guid> <description><![CDATA[本記事は、JavaScript Advent Calendar 2011 (オレ標準コース)の14日目の記事です。 Windowsに付属するJavaScriptエンジンとしてJScript.dllがあります（いやJScr [...]]]></description> <content:encoded><![CDATA[<p>本記事は、<a
href="http://atnd.org/events/21980">JavaScript Advent Calendar 2011 (オレ標準コース)</a>の14日目の記事です。</p><hr
/><p>Windowsに付属するJavaScriptエンジンとしてJScript.dllがあります（いやJScriptと名乗っていますけど）。</p><p>Internet Explorer（8まで）などが使っているほか、APIが公開されており自分のアプリケーションからも呼び出せるのはご存じと思います。そのやり方はググればいくらでも例が見つかりますので、今日はその話ではありません。</p><p>JScript.dllは、いくつかバージョンがありますが最新は5.8です。しかし、5.8には5.7互換モードがあり、自アプリケーションでJScript.dllをホストする場合、デフォルトでは5.7モードで動いてしまうのです（IE8をインストールしても、IEコンポーネントはIE7互換モードで動いてしまうのと似た話ですね）。</p><p>というわけで、5.8で動かすには5.8モードにする指定が必要です。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp">IActiveScriptPtr js<span style="color: #008000;">&#40;</span>L<span style="color: #FF0000;">&quot;JScript&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
IActiveScriptPropertyPtr jsProperty<span style="color: #008000;">&#40;</span>js<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
_variant_t v<span style="color: #008000;">&#40;</span>implicit_cast<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">long</span><span style="color: #000080;">&gt;</span><span style="color: #008000;">&#40;</span>SCRIPTLANGUAGEVERSION_5_8<span style="color: #008000;">&#41;</span>, VT_I4<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// ATL::CComVarinatでも可。</span>
<span style="color: #0000ff;">auto</span> hr <span style="color: #000080;">=</span> jsProperty<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>SetProperty<span style="color: #008000;">&#40;</span>SCRIPTPROP_INVOKEVERSIONING, nullptr, <span style="color: #000040;">&amp;</span>v<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></div></div><p>やっておいて損はないので、JScript.dllを自アプリに組み込もうという場合は忘れずにやっておきましょう。</p><p>サンプルのプログラムです: <a
href="/egtra/download/JScript5.8.cpp">JScript5.8.cpp</a>。Visual C++ 2010とWindows SDK 7.1を使ってコンパイル・実行しました。ATLは使っていないので、Visual C++ Expressでもコンパイルできるはずです。</p> ]]></content:encoded> <wfw:commentRss>http://dev.activebasic.com/egtra/2011/12/14/456/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>IObservable&lt;T&gt;から.NETのeventに変換する</title><link>http://dev.activebasic.com/egtra/2011/12/09/455/</link> <comments>http://dev.activebasic.com/egtra/2011/12/09/455/#comments</comments> <pubDate>Thu, 08 Dec 2011 16:36:24 +0000</pubDate> <dc:creator>egtra</dc:creator> <category><![CDATA[.NET]]></category> <category><![CDATA[C#]]></category> <category><![CDATA[Observable.ToEvent]]></category> <category><![CDATA[Observable.ToEventPattern]]></category> <category><![CDATA[Reactive Extensions]]></category> <guid
isPermaLink="false">http://dev.activebasic.com/egtra/?p=455</guid> <description><![CDATA[ToEventPattern拡張メソッドを使い、IObservableから.NETのイベントへ変換するコードを書けることを試してみました。]]></description> <content:encoded><![CDATA[<p>最近のReactive ExtensionsにはToEventというのがあるのを知りました（via <a
href="http://d.hatena.ne.jp/okazuki/20111208/1323357358">Reactive Extensions再入門 その１５「To*****系メソッド」 &#8211; かずきのBlog@Hatena</a>）。調べてみるとToEventPatternがあることも分かりました。「これってもしかしてIObservable&lt;T&gt;から.NETのイベントを発行するのに使えるのではないか」と思い、早速試してみたところうまくいきました。</p><div
class="wp_syntax"><div
class="code"><pre class="csharp"><span style="color: #6666cc; font-weight: bold;">class</span> Program
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> Main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        var t <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Test<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
        t<span style="color: #008000;">.</span><span style="color: #0000FF;">Hoge</span> <span style="color: #008000;">+=</span> <span style="color: #008000;">&#40;</span>sender, e<span style="color: #008000;">&#41;</span> <span style="color: #008000;">=&gt;</span> Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Hoge event!&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        t<span style="color: #008000;">.</span><span style="color: #0000FF;">FireHoge</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        t<span style="color: #008000;">.</span><span style="color: #0000FF;">FireHoge</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #6666cc; font-weight: bold;">class</span> Test
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> Test<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        ee <span style="color: #008000;">=</span> se<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Select</span><span style="color: #008000;">&#40;</span>e <span style="color: #008000;">=&gt;</span> <span style="color: #008000;">new</span> EventPattern<span style="color: #008000;">&lt;</span>EventArgs<span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #0600FF; font-weight: bold;">this</span>, e<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ToEventPattern</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> FireHoge<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        se<span style="color: #008000;">.</span><span style="color: #0000FF;">OnNext</span><span style="color: #008000;">&#40;</span>EventArgs<span style="color: #008000;">.</span><span style="color: #0000FF;">Empty</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">readonly</span> Subject<span style="color: #008000;">&lt;</span>EventArgs<span style="color: #008000;">&gt;</span> se <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Subject<span style="color: #008000;">&lt;</span>EventArgs<span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #0600FF; font-weight: bold;">readonly</span> IEventPatternSource<span style="color: #008000;">&lt;</span>EventArgs<span style="color: #008000;">&gt;</span> ee<span style="color: #008000;">;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">event</span> EventHandler<span style="color: #008000;">&lt;</span>EventArgs<span style="color: #008000;">&gt;</span> Hoge
    <span style="color: #008000;">&#123;</span>
        add
        <span style="color: #008000;">&#123;</span>
            ee<span style="color: #008000;">.</span><span style="color: #0000FF;">OnNext</span> <span style="color: #008000;">+=</span> value<span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
        remove
        <span style="color: #008000;">&#123;</span>
            ee<span style="color: #008000;">.</span><span style="color: #0000FF;">OnNext</span> <span style="color: #008000;">-=</span> value<span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><p>内部ではRxガンガン使うけど、表向きには.NETのイベントとして公開したいという場合に便利ですね。Windows Phone標準搭載のAPIにもこれ欲しかったです。</p><p>参考: <a
href="http://msdn.microsoft.com/en-us/library/hh244294(VS.103).aspx">Observable.ToEventPattern(TEventArgs) Method (System.Reactive.Linq)</a> (MSDN Library)</p> ]]></content:encoded> <wfw:commentRss>http://dev.activebasic.com/egtra/2011/12/09/455/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>libtta++を使ってTTAを再生する（Windows Phoneで）</title><link>http://dev.activebasic.com/egtra/2011/12/07/453/</link> <comments>http://dev.activebasic.com/egtra/2011/12/07/453/#comments</comments> <pubDate>Wed, 07 Dec 2011 14:59:44 +0000</pubDate> <dc:creator>egtra</dc:creator> <category><![CDATA[C#]]></category> <category><![CDATA[C++]]></category> <category><![CDATA[COM]]></category> <category><![CDATA[WinAPI]]></category> <category><![CDATA[Boost.Interprocess]]></category> <category><![CDATA[libtta++]]></category> <category><![CDATA[SAFEARRAY]]></category> <category><![CDATA[unique_ptr]]></category> <category><![CDATA[Windows Phone]]></category> <guid
isPermaLink="false">http://dev.activebasic.com/egtra/?p=453</guid> <description><![CDATA[本記事は、Windows Phone Advent Calendar 2011 : ATNDの7日目の記事です。 True Audio (TTA)という可逆圧縮の音声形式があります。はい、つまりWindows Phone [...]]]></description> <content:encoded><![CDATA[<p>本記事は、<a
href="http://atnd.org/events/22351">Windows Phone Advent Calendar 2011 : ATND</a>の7日目の記事です。</p><hr
/><p><a
href="http://en.true-audio.com/">True Audio</a> (TTA)という可逆圧縮の音声形式があります。はい、つまりWindows PhoneでTTAの再生ができるかどうかちょっと試してみました。結論から言うと、ハマりどころもなく簡単にできました（まだいろいろと工夫の余地はありますが）。</p><p>公式サイトの<a
href="http://en.true-audio.com/Free_Downloads">Free Downloads</a>を見ると、CとC++で書かれたライブラリがあるようです。迷わずC++版 (libtta++) をダウンロードしました。中身を確認すると、静的LIBを作るVC++プロジェクトとサンプルのコンソールアプリのVC++プロジェクトが入っていました。</p><p>ではここで、Windows Phone OS 7.1ネイティブコードプログラミングのおさらいです。</p><ol><li>Visual Studio 2005 or 2008でWindows Mobile 6.5.3 DTKターゲットのDLLプロジェクトで、普通のCOMコンポーネントを作る要領でコードを書く（<a
href="/egtra/2011/09/14/400/">参考</a>）。</li><li>Visual Studio 2010でWindows Phone OS 7.1プロジェクトを作る。</li><li>VS2010のプロジェクトに1.でビルドしたDLLとWPInteropManifest.xmlを追加する（参考：<a
href="http://nanapho.jp/archives/2011/08/introducing-windows-phone-7-5-native-programming/">Windows Phone 7.5 ネイティブコードプログラミング &#8211; ななふぉ</a>）。</li><li>VS2010プロジェクト側、C#上で1.で作ったインタフェースやクラスに対応する宣言を書く。RegisterComDllの呼び出しを行う。ネイティブDLLで作ったCOMクラスをnewする。</li></ol><hr
/><p>今回はlibtta++の静的LIBをビルドするプロジェクトを作成、1.のDLLプロジェクトでその静的LIBをリンクするようにしました。</p><p>libtta++のビルドは、Visual Studio 2008でやはりWindows Mobile 6.5.3 DTKターゲットの空のプロジェクト（スタティックライブラリ）を新規に作ってやりました。</p><ul><li>そのプロジェクトに、libtta.cppを追加。</li><li>あとconfig.hを開いて、#define CPU_X86の行をコメントアウト。</li></ul><p>Releaseビルドしたら、libtta.libが得られました。なお、付属のVC++プロジェクトを開いてWindows Mobile 6.5.3 DTKの構成を追加する方法はリンク時によく分からないエラーがでてどうしようもなかったので諦めました。</p><p>次にDLLのプロジェクトです。libtta.libのほか、libtta++からconfig.hとlibtta.hを持ってきて使用しています。最後にソースファイル一式ダウンロードのリンクを置くので、詳しくはそちらを見てください。なんの工夫もなく、libtta++付属サンプルを改造し「TTAデコード→WAVをメモリに書き出す→そのメモリを呼び出し元に返す」というプログラムです。</p><p>とりあえず、インタフェースの宣言だけここに載せます。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp">interface __declspec<span style="color: #008000;">&#40;</span>uuid<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;95E19FD5-D011-4979-BBFB-26D9C358BDC0&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
IDebug <span style="color: #008080;">:</span> <span style="color: #0000ff;">public</span> IUnknown
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">virtual</span> HRESULT STDMETHODCALLTYPE WriteLine<span style="color: #008000;">&#40;</span>BSTR s<span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">virtual</span> HRESULT STDMETHODCALLTYPE WriteLineW<span style="color: #008000;">&#40;</span>LPCWSTR s<span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
interface __declspec<span style="color: #008000;">&#40;</span>uuid<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;36F21A71-822B-4CD5-9DC9-F1A68FE6AE04&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
IDecoder <span style="color: #008080;">:</span> IUnknown
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">virtual</span> HRESULT STDMETHODCALLTYPE Init<span style="color: #008000;">&#40;</span>
        <span style="color: #ff0000; font-style: italic;">/*[in]*/</span> IDebug<span style="color: #000040;">*</span> debug<span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">virtual</span> HRESULT STDMETHODCALLTYPE Decode<span style="color: #008000;">&#40;</span>
        <span style="color: #ff0000; font-style: italic;">/*[in]*/</span> BYTE<span style="color: #000040;">*</span> source, <span style="color: #ff0000; font-style: italic;">/*[in]*/</span> <span style="color: #0000ff;">int</span> length,
        <span style="color: #ff0000; font-style: italic;">/*[out, ret]*/</span> SAFEARRAY<span style="color: #000040;">**</span> dest<span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></div></div><p>IDebugについては、OutputDebugStringの代替です（参考：<a
href="http://dev.activebasic.com/egtra/2011/09/13/399/">WP7.1ネイティブとOutputDebugString</a>）。</p><p>これもReleaseビルドします。CycmNativeという名前のVC++プロジェクトだったので、CycmNative.dllが出来上がります。</p><p>いよいよ、Windows Phone OS 7.1プロジェクトの作成です。CycmNative.dllと適当なTTAファイルをプロジェクトに追加します（今回は、TTAファイルを「ビルドアクション：コンテンツ」で埋め込みました）。あと、WPInteropManifest.xmlは以下の内容です。もしかして、空っぽでもイケるんですかね？</p><div
class="wp_syntax"><div
class="code"><pre class="xml"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Interop</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span></pre></div></div><p>C#側のメイン部分のコードは短いのですべてここに載っけてしまいます（もちろん、この記事の最後にプロジェクト一式アーカイブのリンクを用意しています）。</p><div
class="wp_syntax"><div
class="code"><pre class="csharp"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">partial</span> <span style="color: #6666cc; font-weight: bold;">class</span> MainPage <span style="color: #008000;">:</span> PhoneApplicationPage
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> MainPage<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        InitializeComponent<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #6666cc; font-weight: bold;">void</span> PhoneApplicationPage_Loaded<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">object</span> sender, RoutedEventArgs e<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        ComHelper<span style="color: #008000;">.</span><span style="color: #0000FF;">Register</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;cycmnative.dll&quot;</span>, <span style="color: #008000;">typeof</span><span style="color: #008000;">&#40;</span>DecoderImpl<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
        var decoder <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> IDecoder<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        decoder<span style="color: #008000;">.</span><span style="color: #0000FF;">Init</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">new</span> DebugImpl<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
        var rs <span style="color: #008000;">=</span> Application<span style="color: #008000;">.</span><span style="color: #0000FF;">GetResourceStream</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">new</span> Uri<span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;cycm.tta&quot;</span>, UriKind<span style="color: #008000;">.</span><span style="color: #0000FF;">Relative</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #6666cc; font-weight: bold;">byte</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> buf <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #6666cc; font-weight: bold;">byte</span><span style="color: #008000;">&#91;</span>rs<span style="color: #008000;">.</span><span style="color: #0000FF;">Stream</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Length</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">;</span>
        rs<span style="color: #008000;">.</span><span style="color: #0000FF;">Stream</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Read</span><span style="color: #008000;">&#40;</span>buf, <span style="color: #FF0000;">0</span>, buf<span style="color: #008000;">.</span><span style="color: #0000FF;">Length</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        var result <span style="color: #008000;">=</span> decoder<span style="color: #008000;">.</span><span style="color: #0000FF;">Decode</span><span style="color: #008000;">&#40;</span>buf, buf<span style="color: #008000;">.</span><span style="color: #0000FF;">Length</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
        sound <span style="color: #008000;">=</span> SoundEffect<span style="color: #008000;">.</span><span style="color: #0000FF;">FromStream</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">new</span> MemoryStream<span style="color: #008000;">&#40;</span>result<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        soundInstance <span style="color: #008000;">=</span> sound<span style="color: #008000;">.</span><span style="color: #0000FF;">CreateInstance</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        SoundEffect<span style="color: #008000;">.</span><span style="color: #0000FF;">MasterVolume</span> <span style="color: #008000;">=</span> 1<span style="color: #008000;">.</span>0f<span style="color: #008000;">;</span>
        soundInstance<span style="color: #008000;">.</span><span style="color: #0000FF;">Play</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    SoundEffect sound<span style="color: #008000;">;</span>
    SoundEffectInstance soundInstance<span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><p>デコードしたらWAVデータが得られるようになっているので、あとはSoundEffectで再生させているだけです。はい、一気にデコードさせるのではなく、デコードしつつ再生するようにしたいですね。たぶん、MediaStreamSourceを使えばできるのだと思います。</p><p>以上、大変駆け足でのWidnows Phone OS 7.1ネイティブコードプログラミングでした。ID_CAP_INTEROPSERVICES? 何それ？おいしいの？</p><ul><li><a
href="/egtra/download/CycmNative.zip">CycmNative.zip</a>（ネイティブ側VC++2008プロジェクト、libtta++にあわせてLGPLv3）</li><li><a
href="/egtra/download/Cycm.zip">Cycm.zip</a>（マネージ側VC#2010プロジェクト、MIT Lisence）</li></ul> ]]></content:encoded> <wfw:commentRss>http://dev.activebasic.com/egtra/2011/12/07/453/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>C++11時代におけるクラスの書き方</title><link>http://dev.activebasic.com/egtra/2011/12/02/451/</link> <comments>http://dev.activebasic.com/egtra/2011/12/02/451/#comments</comments> <pubDate>Fri, 02 Dec 2011 14:59:49 +0000</pubDate> <dc:creator>egtra</dc:creator> <category><![CDATA[C++]]></category> <guid
isPermaLink="false">http://dev.activebasic.com/egtra/?p=451</guid> <description><![CDATA[本記事は、C++11 Advent Calendar 2011 : ATNDの2日目の記事です。 C++のclassは様々な使い方ができます。後発のほかの言語ではいくつもの概念に分かれているものも、C++ではすべてcla [...]]]></description> <content:encoded><![CDATA[<p>本記事は、<a
href="http://atnd.org/events/21936">C++11 Advent Calendar 2011 : ATND</a>の2日目の記事です。</p><hr
/><p>C++のclassは様々な使い方ができます。後発のほかの言語ではいくつもの概念に分かれているものも、C++ではすべてclassということもあります。</p><p>そこで、C++でclassを定義する際も、classと一括りにせず、自分がいったいどんなclassを書こうとしているのか明確に意識するとよいのではないだろうかと考えました。そのために、私なりのclassの分類をまとめ、この記事を書くことにしました。</p><p>これは、各々のプログラミング言語の経験により違いが出ることと思います。異論もあると思いますので、ご自身でも考えてみると良いと思います。</p><p>以下、この記事では4種類に分類しています。</p><hr
/><p>1つ目は<strong>「オブジェクト指向プログラミング (OOP) を実現するクラス」</strong>です（長いので以下<strong>OOPクラス</strong>と略します）。</p><p>virtual関数を使い、クラスの継承を用いて、多態性を表現するプログラミングスタイルを実現するクラスです。基本的に、これに分類するclass同士の継承は単独継承（すべてpublic）のみです。後述するインタフェースやMix-inのclassを1つまたは複数追加で継承することは構いません。厳密に言うと多重継承は禁止ではありませんが、istream/ostream←iostreamのようにうまいことハマる例は珍しいと思います。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #0000ff;">class</span> Widget
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
    <span style="color: #0000ff;">int</span> GetId<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">virtual</span> <span style="color: #0000ff;">void</span> Draw<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">virtual</span> Rectangle GetBound<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">virtual</span> ~Widget<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000ff;">default</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
    std<span style="color: #008080;">::</span><span style="color: #007788;">unique_ptr</span><span style="color: #000080;">&lt;</span>graphic_t<span style="color: #000080;">&gt;</span> graphic_t<span style="color: #008080;">;</span>
    std<span style="color: #008080;">::</span><span style="color: #007788;">unique_ptr</span><span style="color: #000080;">&lt;</span>window_handle_t<span style="color: #000080;">&gt;</span> window_handle<span style="color: #008080;">;</span>
&nbsp;
    Widget<span style="color: #008000;">&#40;</span>Widget <span style="color: #0000ff;">const</span><span style="color: #000040;">&amp;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">delete</span><span style="color: #008080;">;</span>
    Widget<span style="color: #008000;">&#40;</span>Widget<span style="color: #000040;">&amp;&amp;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">delete</span><span style="color: #008080;">;</span>
    Widget<span style="color: #000040;">&amp;</span> operator <span style="color: #000080;">=</span><span style="color: #008000;">&#40;</span>Widget <span style="color: #0000ff;">const</span><span style="color: #000040;">&amp;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">delete</span><span style="color: #008080;">;</span>
    Widget<span style="color: #000040;">&amp;</span> operator <span style="color: #000080;">=</span><span style="color: #008000;">&#40;</span>Widget<span style="color: #000040;">&amp;&amp;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">delete</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">class</span> TextBox <span style="color: #008080;">:</span> Widget
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
    <span style="color: #0000ff;">virtual</span> <span style="color: #0000ff;">void</span> Draw<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> override<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">virtual</span> Rectangle GetBound<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">virtual</span> ~TextBox<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000ff;">default</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
    std<span style="color: #008080;">::</span><span style="color: #007788;">u16string</span> text<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// ……</span></pre></div></div><dl><dt>デストラクタは原則としてdefaultとし、コンパイラの自動生成に任せます。</dt><dd>リソースの解放処理が必要なら、必ずそれをラップした型を作り、それをメンバとして持つようにします。デバッグログを出力するなどと言った解放処理とあまり関係ない目的ならデストラクタを明示的に書いても良いでしょう。なお、これ（デストラクタは原則としてdefaultにすること）は以下すべての分類のclassに当てはまります。</dd><dt>デストラクタはpublicでvirutalにします。</dt><dd>「非virtualでprotected」や「非virutalでpublic」のclassは、たぶんOOPクラスに当てはまりません</dd><dt>コピーコンストラクタ・コピー代入演算子・ムーブコンストラクタ・ムーブ代入演算子をdeleteします</dt><dd>この種のclassではオブジェクトのコピーはどういう意味を持つのか考えられないことが多いです。あと、スライシングが問題になるという現実もあります。なお、従来通りboost::noncopyableから派生させる方法でも構いません。必要なら、Javaなどオブジェクトへのポインタを持ち運ぶ言語を見習い、newしてunique_ptrまたはmake_sharedしてshared_ptrに入れましょう。</dd></dl><p>最後のコピー禁止にする話の補足です。希に、コピーを作れるようにしたい場合もあるとは思います。その場合は、JavaやC#のようにCloneメンバ関数を「virtualで」定義しましょう。その場合、Cloneメンバ関数の実装を目的として、protectedなコピーコンストラクタを定義しても構いません。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #0000ff;">class</span> Node
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
    <span style="color: #0000ff;">virtual</span> std<span style="color: #008080;">::</span><span style="color: #007788;">unique_ptr</span><span style="color: #000080;">&lt;</span>Node<span style="color: #000080;">&gt;</span> Clone<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    ~Node<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000ff;">default</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">protected</span><span style="color: #008080;">:</span>
    Node<span style="color: #008000;">&#40;</span>Node <span style="color: #0000ff;">const</span><span style="color: #000040;">&amp;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000ff;">default</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
    std<span style="color: #008080;">::</span><span style="color: #007788;">string</span> name<span style="color: #008080;">;</span>
&nbsp;
    Node<span style="color: #008000;">&#40;</span>Node<span style="color: #000040;">&amp;&amp;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">delete</span><span style="color: #008080;">;</span>
    Node<span style="color: #000040;">&amp;</span> operator <span style="color: #000080;">=</span><span style="color: #008000;">&#40;</span>Node <span style="color: #0000ff;">const</span><span style="color: #000040;">&amp;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">delete</span><span style="color: #008080;">;</span>
    Node<span style="color: #000040;">&amp;</span> operator <span style="color: #000080;">=</span><span style="color: #008000;">&#40;</span>Node<span style="color: #000040;">&amp;&amp;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">delete</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">class</span> TextNode <span style="color: #008080;">:</span> <span style="color: #0000ff;">public</span> Node
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
    <span style="color: #0000ff;">virtual</span> std<span style="color: #008080;">::</span><span style="color: #007788;">unique_ptr</span><span style="color: #000080;">&lt;</span>TextNode<span style="color: #000080;">&gt;</span> Clone<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> override<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">protected</span><span style="color: #008080;">:</span>
    TextNode<span style="color: #008000;">&#40;</span>TextNode <span style="color: #0000ff;">const</span><span style="color: #000040;">&amp;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
std<span style="color: #008080;">::</span><span style="color: #007788;">unique_ptr</span><span style="color: #000080;">&lt;</span>TextNode<span style="color: #000080;">&gt;</span> TextNode<span style="color: #008080;">::</span><span style="color: #007788;">Clone</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #008000;">&#123;</span><span style="color: #0000dd;">new</span> TextNode<span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span><span style="color: #0000dd;">this</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div><hr
/><p>2つ目、<strong>「インタフェース」</strong>です。</p><p>JavaとかC#とかのinterfaceです。C++だと純粋仮想関数を並べたクラスとして表現します。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #0000ff;">class</span> IHogeable
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
    <span style="color: #0000ff;">virtual</span> <span style="color: #0000ff;">void</span> Foo<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> x, <span style="color: #0000ff;">int</span> y<span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">virtual</span> ~IHogeable<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000ff;">default</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
    IHogeable<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> IHogeable<span style="color: #000040;">&amp;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">delete</span><span style="color: #008080;">;</span>
    IHogeable<span style="color: #008000;">&#40;</span>IHogeable<span style="color: #000040;">&amp;&amp;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">delete</span><span style="color: #008080;">;</span>
    IHogeable<span style="color: #000040;">&amp;</span> operator <span style="color: #000080;">=</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> IHogeable<span style="color: #000040;">&amp;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">delete</span><span style="color: #008080;">;</span>
    IHogeable<span style="color: #000040;">&amp;</span> operator <span style="color: #000080;">=</span><span style="color: #008000;">&#40;</span>IHogeable<span style="color: #000040;">&amp;&amp;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">delete</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></div></div><p>名前にIを付けているのは、私の趣味（COMや.NET由来）なので真似なくて構いません。</p><p>インタフェースは、他のインタフェースを複数継承しても構いません。OOPクラスは1つあるいは複数のインタフェースを継承して構いません。インタフェースがOOPクラスあるいは他のclassを継承するのはあり得ません（インタフェースがboost::noncopyableから派生するというよう例外はありますが）。</p><p>デストラクタをpublicでvirtualに、コピー・ムーブ禁止であるところはOOPクラスと同じです。</p><p>実際のところ、C++で純粋仮想関数ばかりを並べたインタフェースというのはあまり作らないように思います。大抵、NVIパターン (Non-Virtual Interface Idiom)で作ると思うのです（NVIについては<a
href="http://www.radiumsoftware.com/0309.html#030929">Non-Virtual Interface Idiom &#8211; Radium Software Development</a>などを参照してください）。これはこのインタフェースに分類すべきか次のMix-inに分類すべきか、若干悩ましいです。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #0000ff;">class</span> IHogeable
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
    <span style="color: #0000ff;">void</span> Foo<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> x, <span style="color: #0000ff;">int</span> y<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>x <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">0</span> <span style="color: #000040;">||</span> y <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0000ff;">throw</span> <span style="color: #0000dd;">new</span> out_of_range<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;……&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
        FooImpl<span style="color: #008000;">&#40;</span>x, y<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">void</span> Foo<span style="color: #008000;">&#40;</span>Point pt<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">return</span> Foo<span style="color: #008000;">&#40;</span>pt.<span style="color: #007788;">X</span>, pt.<span style="color: #007788;">Y</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">virtual</span> ~IHogeable<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000ff;">default</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">protected</span><span style="color: #008080;">:</span>
    <span style="color: #0000ff;">virtual</span> <span style="color: #0000ff;">void</span> FooImpl<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> x, <span style="color: #0000ff;">int</span> y<span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
    IHogeable<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> IHogeable<span style="color: #000040;">&amp;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">delete</span><span style="color: #008080;">;</span>
    IHogeable<span style="color: #008000;">&#40;</span>IHogeable<span style="color: #000040;">&amp;&amp;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">delete</span><span style="color: #008080;">;</span>
    IHogeable<span style="color: #000040;">&amp;</span> operator <span style="color: #000080;">=</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> IHogeable<span style="color: #000040;">&amp;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">delete</span><span style="color: #008080;">;</span>
    IHogeable<span style="color: #000040;">&amp;</span> operator <span style="color: #000080;">=</span><span style="color: #008000;">&#40;</span>IHogeable<span style="color: #000040;">&amp;&amp;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">delete</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></div></div><hr
/><p>3つ目、<strong>「Mix-in」</strong>です。</p><p>制約を課して多重継承を使うという考え方といって合っているでしょうかね。私が最初に見たまともな説明は<a
href="http://itpro.nikkeibp.co.jp/article/COLUMN/20050915/221232/">まつもと直伝　プログラミングのオキテ 第3回（3） &#8211; まつもと直伝 プログラミングのオキテ：ITpro</a>だったような気がします。ここには、Mix-inについて次のように書いてあります。</p><blockquote><p>Mix-inというのは元々Lisp界で始まった多重継承の使い方です。Mix-in手法には次の2つの条件があります。</p><ul><li>通常の継承は単一継承に限る</li><li>2つめ以降の継承は，Mix-inと呼ばれる抽象クラスからに限定する</li></ul><p>Mix-inクラスは以下のような特徴を備えた抽象クラスです。</p><ul><li>単独でインスタンスを作らない</li><li>通常のクラスから継承しない</li></ul></blockquote><p>私としては、Mix-in classへアップキャストしての（実行時の）多態性は必要としないという印象があります。そのため、Mix-in classではprotected非virtualデストラクタとします。Mix-in classを継承する際はprotectedまたはprivate継承という場合もあります。また、CRTP (Curiously recurring template pattern)との相性も良いです。</p><p>Mix-inのclassは、インタフェース同様1つあるいは複数のMix-inから派生して構いません。また、インタフェースを1つまたは複数継承することも構いません。</p><p>コピー・ムーブのコンストラクタ・代入演算子はケースバイケースです。というのも、このMix-inのclass、用途によってはOOPクラスのほか、後述するデータ抽象のclassが継承することもあり得るためです。次の可能性があり得るでしょう。</p><ul><li>すべてdelete（OOPクラス・インタフェース同様）</li><li>ムーブのみprotectedで定義</li><li>ムーブ・コピーをprotectedで定義</li></ul><p>いずれにせよ、定義する場合は原則としてdefaultで定義しましょう、と言う点は変わりません。</p><p>Boost.OperatorsやBoost.Noncopyableもここに分類します。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #0000ff;">class</span> IUnknownCounter
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">long</span> AddRefImpl<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">return</span> count<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">long</span> ReleaseImpl<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">long</span> ret <span style="color: #000080;">=</span> <span style="color: #000040;">--</span>count<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>ret <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0000dd;">delete</span> <span style="color: #0000dd;">this</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
        <span style="color: #0000ff;">return</span> ret<span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">protected</span><span style="color: #008080;">:</span>
    ~IUnknownCounter<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000ff;">default</span><span style="color: #008080;">;</span>
    IUnknownCounter<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> IUnknownCounter<span style="color: #000040;">&amp;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">delete</span><span style="color: #008080;">;</span>
    IUnknownCounter<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span><span style="color: #000040;">&amp;&amp;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">delete</span><span style="color: #008080;">;</span>
    IUnknownCounter<span style="color: #000040;">&amp;</span> operator <span style="color: #000080;">=</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> IUnknownCounter<span style="color: #000040;">&amp;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">delete</span><span style="color: #008080;">;</span>
    IUnknownCounter<span style="color: #000040;">&amp;</span> operator <span style="color: #000080;">=</span><span style="color: #008000;">&#40;</span>IUnknownCounter<span style="color: #000040;">&amp;&amp;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">delete</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
    std<span style="color: #008080;">::</span><span style="color: #007788;">atomic</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">long</span><span style="color: #000080;">&gt;</span> count<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></div></div><hr
/><p>4つ目、本日の最後、<strong>「データ抽象」</strong>です。</p><p>これは、virutalメンバ関数による多態性の実現を利用しないclassです。標準ライブラリでも各種STLコンテナやイテレータ、std::basic_string (std::string)、std::threadなど多数存在します。</p><p>デストラクタは非virtualでpublicです。継承は原則として用いませんが、Mix-in classを継承することはあります（例：イテレータの実装にboost::iterator_facade (Mix-in)を継承）。</p><p>ムーブコンストラクタ・ムーブ代入演算子はできる限りpublicに定義（もちろんdefault定義を推奨）、可能ならコピーコンストラクタ・コピー代入演算子も定義（もちろんdefault定義を推奨）します。</p><div
class="wp_syntax"><div
class="code"><pre class="cpp"><span style="color: #0000ff;">class</span> UserInfo
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
    UserInfo<span style="color: #008000;">&#40;</span>std<span style="color: #008080;">::</span><span style="color: #007788;">string</span> userName, ptime loginTime<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    std<span style="color: #008080;">::</span><span style="color: #007788;">string</span> GetName<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span><span style="color: #008080;">;</span>
    ptime LastLoginTime<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span><span style="color: #008080;">;</span>
&nbsp;
    UserInfo<span style="color: #008000;">&#40;</span>UserInfo <span style="color: #0000ff;">const</span><span style="color: #000040;">&amp;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000ff;">default</span><span style="color: #008080;">;</span>
    UserInfo<span style="color: #008000;">&#40;</span>UserInfo<span style="color: #000040;">&amp;&amp;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000ff;">default</span><span style="color: #008080;">;</span>
    UserInfo<span style="color: #000040;">&amp;</span> operator <span style="color: #000080;">=</span><span style="color: #008000;">&#40;</span>UserInfo <span style="color: #0000ff;">const</span><span style="color: #000040;">&amp;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000ff;">default</span><span style="color: #008080;">;</span>
    UserInfo<span style="color: #000040;">&amp;</span> operator <span style="color: #000080;">=</span><span style="color: #008000;">&#40;</span>UserInfo<span style="color: #000040;">&amp;&amp;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000ff;">default</span><span style="color: #008080;">;</span>
&nbsp;
    ~UserInfo<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000ff;">default</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
    std<span style="color: #008080;">::</span><span style="color: #007788;">string</span> name<span style="color: #008080;">;</span>
    ptime lastLogin<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></div></div><hr/><p>繰り返しますが、どの場合でもデストラクタはdefaultで定義します。自分自身では書きません。<br
/> どういうことかと言うと、必要な解放処理はできる限りメンバ変数（のデストラクタ）に任せることで、自分（このクラス）自身では「特にデストラクタでやることはない」という状態を目指します。その解放処理のためのクラスだけが唯一デストラクタを明示的に定義して良い例外パターンです。</p><p>なお、それすらもstd::shared_ptrやstd::unique_ptrで足りる場合も多いでしょう。unique_ptrについては以下が参考になると思います。</p><ul><li><a
href="http://d.hatena.ne.jp/krustf/20100827/1282915158">unique_ptr のデリータ指定 &#8211; krustf の雑記</a></li><li><a
href="http://cpplover.blogspot.com/2010/02/blog-post_8598.html">本の虫: 正しい方法じゃないなぁ</a></li></ul><p>最後に、今日の記事の大元のネタは<a
href="http://www.ogis-ri.co.jp/otc/hiroba/technical/CppDesignNote/">C++ クラス設計に関するノート</a>です。これを自分なりに解釈して考えをまとめたいという思いで、本記事を書こうと思いました。感謝します。</p><hr
/><p><ins
datetime="2012-05-08T02:55:00+09:00">2012年5月8日：誤字の修正や表現の変更を行いました。</ins></p> ]]></content:encoded> <wfw:commentRss>http://dev.activebasic.com/egtra/2011/12/02/451/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
<!-- Dynamic page generated in 1.502 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2012-05-09 02:05:01 -->
<!-- Compression = gzip -->
