<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>東方算程譚</title><link>http://blogs.wankuma.com/episteme/</link><description>Oriental Code Talk ── επιστημηが与太をこく、弾幕とは無縁のシロモノ。</description><managingEditor>επιστημη</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>επιστημη</dc:creator><title>Intel CnC であそんでみた(そのに)</title><link>http://blogs.wankuma.com/episteme/archive/2013/08/03/328047.aspx</link><pubDate>Sat, 03 Aug 2013 22:49:00 GMT</pubDate><guid>http://blogs.wankuma.com/episteme/archive/2013/08/03/328047.aspx</guid><wfw:comment>http://blogs.wankuma.com/episteme/comments/328047.aspx</wfw:comment><comments>http://blogs.wankuma.com/episteme/archive/2013/08/03/328047.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/episteme/comments/commentRss/328047.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/episteme/services/trackbacks/328047.aspx</trackback:ping><description>&lt;p&gt;&lt;A href="http://blogs.wankuma.com/episteme/archive/2013/08/03/328045.aspx"&gt;前回の複利計算&lt;/a&gt;。お気づきとは存じますが実はちっとも並列処理&lt;strong&gt;やってません&lt;/strong&gt;。&lt;br&gt;
n-1番step が完了(n-1番itemを出力)するまで n番step は出番がなくて&lt;strong&gt;居眠り&lt;/strong&gt;してますからね。&lt;/p&gt;

&lt;p&gt;もちっとマシな、並列処理をちゃんとやるサンプルをこさえました。毎度おなじみ"ソート"です。&lt;/p&gt;
&lt;p&gt;戦術はこんなかんじ:
&lt;ul&gt;
&lt;li&gt;"範囲[lo,hi) をソートする"&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt; 範囲がそこそこ小さいときはフツーに選択ソートを行う&lt;/li&gt;
&lt;li&gt; さもなくば、範囲を 前半部[lo,mid) と 後半部[mid,hi) とに分け、&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;"範囲[lo,mid) をソートする"&lt;/li&gt;
&lt;li&gt;"範囲[mid,hi) をソートする"&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;/ul&gt;
ひとつのstepが新たな2つのstepに着火します。&lt;br&gt;
この場合step数が&lt;strong&gt;わらわら&lt;/strong&gt;増えますけど、そいつらの管理/制御は CnC任せ、&lt;br&gt;
動かせるスレッド数に合わせて善きに計らってくれます。&lt;p&gt;&lt;/p&gt;

&lt;div class="code"&gt;&lt;pre&gt;&lt;font color="green"&gt;/*
 * Intel Concurrent Collections (CnC)
 * ソート
 */&lt;/font&gt;

&lt;b&gt;#include&lt;/b&gt; &amp;lt;iostream&amp;gt;
&lt;b&gt;#include&lt;/b&gt; &amp;lt;algorithm&amp;gt;
&lt;b&gt;#include&lt;/b&gt; &amp;lt;vector&amp;gt;
&lt;b&gt;#include&lt;/b&gt; &amp;lt;numeric&amp;gt;
&lt;b&gt;#include&lt;/b&gt; &amp;lt;utility&amp;gt;
&lt;b&gt;#include&lt;/b&gt; &amp;lt;cnc/cnc.h&amp;gt;

&lt;b&gt;using&lt;/b&gt; &lt;b&gt;namespace&lt;/b&gt; std;

&lt;b&gt;struct&lt;/b&gt; my_context; &lt;font color="green"&gt;// forward decl.&lt;/font&gt;

&lt;b&gt;struct&lt;/b&gt; my_step {
  &lt;b&gt;int&lt;/b&gt; execute(&lt;b&gt;const&lt;/b&gt; pair&amp;lt;&lt;b&gt;int&lt;/b&gt;,&lt;b&gt;int&lt;/b&gt;&amp;gt;&amp;amp; range, my_context&amp;amp; ctx) &lt;b&gt;const&lt;/b&gt;;
};

&lt;b&gt;struct&lt;/b&gt; my_context : &lt;b&gt;public&lt;/b&gt; CnC::context&amp;lt;my_context&amp;gt; {
  CnC::step_collection&amp;lt;my_step&amp;gt;      steps;
  CnC::tag_collection&amp;lt;pair&amp;lt;&lt;b&gt;int&lt;/b&gt;,&lt;b&gt;int&lt;/b&gt;&amp;gt;&amp;gt; tags;
  &lt;b&gt;int&lt;/b&gt;                                limit; &lt;font color="green"&gt;// これを下回ったら選択ソート&lt;/font&gt;
  vector&amp;lt;&lt;b&gt;int&lt;/b&gt;&amp;gt;                        data;

  my_context() : steps(*&lt;b&gt;this&lt;/b&gt;), tags(*&lt;b&gt;this&lt;/b&gt;) {
    tags.prescribes(steps, *&lt;b&gt;this&lt;/b&gt;); &lt;font color="green"&gt;// tags は steps に 指示する&lt;/font&gt;
  }

  &lt;b&gt;void&lt;/b&gt; selection_sort(&lt;b&gt;int&lt;/b&gt; first, &lt;b&gt;int&lt;/b&gt; last) {
    &lt;b&gt;while&lt;/b&gt; ( first &amp;lt; last ) {
      iter_swap(data.begin()+first, min_element(data.begin()+first, data.begin()+last));
      ++first;
    }
  }
};

&lt;font color="green"&gt;// rangeが示す範囲のデータをソートする&lt;/font&gt;
&lt;b&gt;int&lt;/b&gt; my_step::execute(&lt;b&gt;const&lt;/b&gt; pair&amp;lt;&lt;b&gt;int&lt;/b&gt;,&lt;b&gt;int&lt;/b&gt;&amp;gt;&amp;amp; range, my_context&amp;amp; ctx) &lt;b&gt;const&lt;/b&gt; {
  &lt;b&gt;int&lt;/b&gt; lo = range.first;
  &lt;b&gt;int&lt;/b&gt; hi = range.second;
&lt;b&gt;#ifdef&lt;/b&gt; _DEBUG
  &lt;b&gt;static&lt;/b&gt; &lt;b&gt;int&lt;/b&gt; steps = 0;
  cout &amp;lt;&amp;lt; ++steps &amp;lt;&amp;lt; '[' &amp;lt;&amp;lt; lo &amp;lt;&amp;lt; ',' &amp;lt;&amp;lt; hi &amp;lt;&amp;lt; ")\n";
&lt;b&gt;#endif&lt;/b&gt;

  &lt;b&gt;if&lt;/b&gt; ( (hi - lo) &amp;lt; ctx.limit ) {
    &lt;font color="green"&gt;// 小さな範囲に対しては選択ソートを行う&lt;/font&gt;
    ctx.selection_sort(lo,hi);
  } &lt;b&gt;else&lt;/b&gt; {
    &lt;font color="green"&gt;// 範囲内のデータを前半/後半に分け、&lt;/font&gt;
    &lt;b&gt;int&lt;/b&gt; mid = (lo + hi) / 2;
    nth_element(ctx.data.begin()+lo, ctx.data.begin()+mid, ctx.data.begin()+hi);
    &lt;font color="green"&gt;// それぞれに対しソートする&lt;/font&gt;
    ctx.tags.put(make_pair(lo, mid)); &lt;font color="green"&gt;// 前半部に着火&lt;/font&gt;
    ctx.tags.put(make_pair(mid, hi)); &lt;font color="green"&gt;// 後半部に着火&lt;/font&gt;
  }
  &lt;b&gt;return&lt;/b&gt; CnC::CNC_Success;
}

&lt;b&gt;int&lt;/b&gt; main() {
  &lt;b&gt;const&lt;/b&gt; &lt;b&gt;int&lt;/b&gt; N = 1000; &lt;font color="green"&gt;// データ数&lt;/font&gt;
  my_context ctx;
  ctx.limit = 20;

  &lt;font color="green"&gt;// N個のデータを用意する&lt;/font&gt;
  ctx.data.assign(N, 0);
  iota(ctx.data.begin(), ctx.data.end(), 0);
  random_shuffle(ctx.data.begin(), ctx.data.end());

  ctx.tags.put(make_pair(0,N)); &lt;font color="green"&gt;// ソート開始!&lt;/font&gt;
  ctx.wait(); &lt;font color="green"&gt;// 終わるのを待って&lt;/font&gt;

  &lt;font color="green"&gt;// 結果を確認する&lt;/font&gt;
  &lt;b&gt;if&lt;/b&gt; ( is_sorted(ctx.data.begin(), ctx.data.end()) ) {
    cout &amp;lt;&amp;lt; "OK!" &amp;lt;&amp;lt; endl;
  }
}
&lt;/pre&gt;&lt;/div&gt;&lt;img src ="http://blogs.wankuma.com/episteme/aggbug/328047.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>Intel CnC であそんでみた(ちょっとだけ)</title><link>http://blogs.wankuma.com/episteme/archive/2013/08/03/328045.aspx</link><pubDate>Sat, 03 Aug 2013 12:39:00 GMT</pubDate><guid>http://blogs.wankuma.com/episteme/archive/2013/08/03/328045.aspx</guid><wfw:comment>http://blogs.wankuma.com/episteme/comments/328045.aspx</wfw:comment><comments>http://blogs.wankuma.com/episteme/archive/2013/08/03/328045.aspx#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://blogs.wankuma.com/episteme/comments/commentRss/328045.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/episteme/services/trackbacks/328045.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://software.intel.com/en-us/articles/intel-concurrent-collections-for-cc/"&gt;Intel Concurrent Collections (CnC)&lt;/a&gt; ってシロモノを見つけました。&lt;/p&gt;
&lt;p&gt;並列化のためのライブラリなんだけど、フツーのたとえば pthread だとか PPL, TBB とは一味違ってます。&lt;/p&gt;
&lt;p&gt;CnC が提供する構成要素は大きく3つ:
&lt;ul&gt;
&lt;li&gt; &lt;strong&gt;step&lt;/strong&gt; : 処理単位&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;item&lt;/strong&gt; : stepの入力/出力&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;tag&lt;/strong&gt;  : stepの着火装置&lt;/li&gt;
&lt;/ul&gt;
「tagによって着火されたstepはitemから読み、処理を行い、itemに結果を書く」&lt;br&gt;
が基本構成。&lt;p&gt;&lt;/p&gt;
&lt;img src="http://www1.c3-net.ne.jp/episteme/images/CnC_basic.png"&gt;
&lt;p&gt;これ使って複利計算をやってみます。&lt;br&gt;
n番itemは"n年目の残高"を表すこととし、n番stepでのおしごとを&lt;br&gt;
「n-1番item を読出し 1+利率を掛けて n番item に書く」とします。&lt;br&gt;
そうすればこいつをN個数珠つなぎにして一気に着火すればN年目までの残高が求まるよね。&lt;br&gt;
&lt;img src="http://www1.c3-net.ne.jp/episteme/images/CnC_compound_interest.png"&gt;&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre&gt;&lt;span class="comment"&gt;/*
 * Intel Concurrent Collections (CnC)
 * 複利計算
 */&lt;/span&gt;

&lt;span class="keyword"&gt;#include&lt;/span&gt; &amp;lt;iostream&amp;gt;
&lt;span class="keyword"&gt;#include&lt;/span&gt; &amp;lt;iomanip&amp;gt;
&lt;span class="keyword"&gt;#include&lt;/span&gt; &amp;lt;array&amp;gt;
&lt;span class="keyword"&gt;#include&lt;/span&gt; &amp;lt;cnc/cnc.h&amp;gt;

&lt;span class="keyword"&gt;using&lt;/span&gt; &lt;span class="keyword"&gt;namespace&lt;/span&gt; std;

&lt;span class="keyword"&gt;struct&lt;/span&gt; my_context; &lt;span class="comment"&gt;// forward decl.&lt;/span&gt;

&lt;span class="keyword"&gt;struct&lt;/span&gt; my_step {
  &lt;span class="keyword"&gt;int&lt;/span&gt; execute(&lt;span class="keyword"&gt;const&lt;/span&gt; &lt;span class="keyword"&gt;int&lt;/span&gt;&amp;amp; n, my_context&amp;amp; ctx) &lt;span class="keyword"&gt;const&lt;/span&gt;;
};

&lt;span class="keyword"&gt;struct&lt;/span&gt; my_context : &lt;span class="keyword"&gt;public&lt;/span&gt; CnC::context&amp;lt;my_context&amp;gt; {
  CnC::step_collection&amp;lt;my_step&amp;gt;    steps;
  CnC::tag_collection&amp;lt;&lt;span class="keyword"&gt;int&lt;/span&gt;&amp;gt;         tags;
  CnC::item_collection&amp;lt;&lt;span class="keyword"&gt;int&lt;/span&gt;,&lt;span class="keyword"&gt;double&lt;/span&gt;&amp;gt; items;
  &lt;span class="keyword"&gt;double&lt;/span&gt;                           rate;  &lt;span class="comment"&gt;// 利率&lt;/span&gt;

  my_context() : steps(*&lt;span class="keyword"&gt;this&lt;/span&gt;), tags(*&lt;span class="keyword"&gt;this&lt;/span&gt;), items(*&lt;span class="keyword"&gt;this&lt;/span&gt;) {
    tags.prescribes(steps, *&lt;span class="keyword"&gt;this&lt;/span&gt;); &lt;span class="comment"&gt;// tags は steps に 指示する&lt;/span&gt;
    steps.consumes(items);         &lt;span class="comment"&gt;// steps は items を消費する&lt;/span&gt;
    steps.produces(items);         &lt;span class="comment"&gt;// steps は items を生産する&lt;/span&gt;
  }
};

&lt;span class="comment"&gt;// 前年の残高と利率から本年の残高を求める&lt;/span&gt;
&lt;span class="keyword"&gt;int&lt;/span&gt; my_step::execute(&lt;span class="keyword"&gt;const&lt;/span&gt; &lt;span class="keyword"&gt;int&lt;/span&gt;&amp;amp; n, my_context&amp;amp; ctx) &lt;span class="keyword"&gt;const&lt;/span&gt; {
  &lt;span class="comment"&gt;// n 年後の残高は&lt;/span&gt;
  &lt;span class="keyword"&gt;double&lt;/span&gt; result;
  ctx.items.get(n-1, result); &lt;span class="comment"&gt;// n-1 年後の残高に&lt;/span&gt;
  result *= (1.0 + ctx.rate); &lt;span class="comment"&gt;// 利率をかけたもの&lt;/span&gt;
  ctx.items.put(n, result);   &lt;span class="comment"&gt;// である&lt;/span&gt;
  &lt;span class="keyword"&gt;return&lt;/span&gt; CnC::CNC_Success;
}

&lt;span class="keyword"&gt;int&lt;/span&gt; main() {
  my_context ctx;
  ctx.rate = 0.05;           &lt;span class="comment"&gt;// 年利5%の定期預金に&lt;/span&gt;
  ctx.items.put(0, 10000.0); &lt;span class="comment"&gt;// 初年度に1万円預けて&lt;/span&gt;
  &lt;span class="keyword"&gt;const&lt;/span&gt; &lt;span class="keyword"&gt;int&lt;/span&gt; duration = 10;   &lt;span class="comment"&gt;// 10年間放置するとき&lt;/span&gt;

  &lt;span class="comment"&gt;// 1年後, 2年後, ... 10年後 の残高を求めよ!&lt;/span&gt;
  &lt;span class="keyword"&gt;for&lt;/span&gt; ( &lt;span class="keyword"&gt;int&lt;/span&gt; n = 1; n &amp;lt;= duration; ++n ) {
    ctx.tags.put(n); &lt;span class="comment"&gt;// ここでstepをkickする&lt;/span&gt;
  }
  ctx.wait(); &lt;span class="comment"&gt;// 終わるのを待って&lt;/span&gt;

  &lt;span class="comment"&gt;// 結果を整列させ&lt;/span&gt;
  array&amp;lt;&lt;span class="keyword"&gt;double&lt;/span&gt;, duration+1&amp;gt; balances;
  &lt;span class="keyword"&gt;for&lt;/span&gt; ( &lt;span class="keyword"&gt;const&lt;/span&gt; &lt;span class="keyword"&gt;auto&lt;/span&gt;&amp;amp; item : ctx.items ) {
    balances[item.first] = *item.second;
  }

  &lt;span class="comment"&gt;// 出力する&lt;/span&gt;
  &lt;span class="keyword"&gt;for&lt;/span&gt; ( &lt;span class="keyword"&gt;const&lt;/span&gt; &lt;span class="keyword"&gt;auto&lt;/span&gt; balance : balances ) {
    cout &amp;lt;&amp;lt; balance &amp;lt;&amp;lt; endl;
  }
}
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;これでできちゃうです。スレッドだのタスクだの考えなくていい。&lt;br&gt;そーゆーのはCnCの実行エンジンが&lt;strong&gt;善きに計らって&lt;/strong&gt;くれるです。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/episteme/aggbug/328045.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>[C++/CX] ややこしい仕事は裏でやる</title><link>http://blogs.wankuma.com/episteme/archive/2013/04/09/327840.aspx</link><pubDate>Tue, 09 Apr 2013 21:07:00 GMT</pubDate><guid>http://blogs.wankuma.com/episteme/archive/2013/04/09/327840.aspx</guid><wfw:comment>http://blogs.wankuma.com/episteme/comments/327840.aspx</wfw:comment><comments>http://blogs.wankuma.com/episteme/archive/2013/04/09/327840.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/episteme/comments/commentRss/327840.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/episteme/services/trackbacks/327840.aspx</trackback:ping><description>&lt;p&gt;非同期処理そのに。&lt;br&gt;ストアアプリはスレート/タブレット機でも動かさならんのでパフォーマンス重視、重たい処理のおかげでUIが固まるのを嫌います。なので時間のかかる処理はUIとは&lt;strong&gt;独立したスレッド&lt;/strong&gt;でやれ、と。&lt;/p&gt;&lt;p&gt;たとえばフィボナッチ数を求める。&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&amp;nbsp; int fibonacci(int n) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( n &amp;lt; 0 ) n = -n;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( n == 0 || n == 1 ) return 1;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return fibonacci(n-1) + fibonacci(n-2);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp; }&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;再帰しまくる&lt;/strong&gt;関数です。ボタンをひとつ追加します。&lt;/p&gt;&lt;p&gt;&lt;img src="http://www1.c3-net.ne.jp/episteme/images/cppcx_7th/step1.png"&gt;&lt;/p&gt;&lt;p&gt;コマンドの紐付けは&lt;strong&gt;前回と同じ&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;さて、上記の fibonacci() を裏で動かすには ＜&lt;strong&gt;ppltasks.h&lt;/strong&gt;＞ を #include し、&lt;br&gt;using namespace &lt;strong&gt;concurrency&lt;/strong&gt;; した上で &lt;strong&gt;create_task&lt;/strong&gt;() を呼べばいい。&lt;br&gt;ただし create_task() の引数は Windows::Foundation::&lt;strong&gt;IAsyncAction族&lt;/strong&gt;でなくちゃならん。&lt;br&gt;&lt;strong&gt;create_async&lt;/strong&gt;() にラムダ式や関数オブジェクトを渡すと IAsyncAction族 を作ってくれるので、&lt;br&gt;そいつを create_task() に渡します。&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&amp;nbsp; &lt;font color="#008000"&gt;// ボタン押されたら async_fibonacci() を呼ぶ&lt;/font&gt;&lt;br&gt;&amp;nbsp; ICommand^ CounterModel::Fibonacci::get() { &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return ref new Command(ref new Action([this](Object^) { async_fibonacci();}));&lt;br&gt;&amp;nbsp; }&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&amp;nbsp; &lt;font color="#008000"&gt;// フィボナッチ数を求め、表示する&lt;/font&gt;&lt;br&gt;&amp;nbsp; void CounterModel::async_fibonacci() {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; create_task(&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008000"&gt;// カウント値を引数に fibonacci数を求める&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; create_async([this]()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { return fibonacci(Count); }))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#008000"&gt;// 答えが出たら表示&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .then&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ([this](int n) { set(n); })&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&lt;br&gt;&amp;nbsp; }&lt;/font&gt;&lt;/p&gt;&lt;p&gt;create_task() のあと .then( 次にする仕事 ) で処理を裏で続けられます。&lt;br&gt;C#/VBだと async/await とかいう構文で楽できるらしいけど、C++/CXではこれがお作法。&lt;/p&gt;&lt;p&gt;これまでのマトメとして、プロジェクトまるごと&lt;strong&gt;&lt;font size="5"&gt; &lt;/font&gt;&lt;/strong&gt;&lt;a href="http://www1.c3-net.ne.jp/episteme/images/cppcx_7th/App1.zip"&gt;&lt;strong&gt;&lt;font size="5"&gt;ココ&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;に置いときます。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/episteme/aggbug/327840.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>[C++/CX] コマンドの紐付け</title><link>http://blogs.wankuma.com/episteme/archive/2013/04/07/327449.aspx</link><pubDate>Sun, 07 Apr 2013 21:30:00 GMT</pubDate><guid>http://blogs.wankuma.com/episteme/archive/2013/04/07/327449.aspx</guid><wfw:comment>http://blogs.wankuma.com/episteme/comments/327449.aspx</wfw:comment><comments>http://blogs.wankuma.com/episteme/archive/2013/04/07/327449.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/episteme/comments/commentRss/327449.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/episteme/services/trackbacks/327449.aspx</trackback:ping><description>&lt;p&gt;おつぎはちょっとだけメンドクセーこと。&lt;br&gt;ボタンのクリックイベント・ハンドラを廃しプロパティに紐付ける。&lt;br&gt;これができればコード・ビハインドが減るし、MVVMとかゆー&lt;strong&gt;小洒落た&lt;/strong&gt;マネができるとな。&lt;/p&gt;&lt;p&gt;現時点でふたつのボタンのClickイベント・ハンドラを TrialPage.xaml.hおよびcppから取っ払う。&lt;br&gt;しかるのち ボタンのCommand属性を追加。&lt;/p&gt;&lt;p&gt;&lt;img src="http://www1.c3-net.ne.jp/episteme/images/cppcx_6th/step1.png"&gt;&lt;/p&gt;&lt;p&gt;紐付けたプロパティ:Increment/Decremenet をCounterModelに追加。&lt;br&gt;プロパティの型は Windows::UI::Xaml::Input::ICommand^ なのでヘッダはこんな:&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;// --- Countermodel.h&lt;br&gt;&amp;nbsp; ...&lt;br&gt;&amp;nbsp; [Windows::UI::Xaml::Data::Bindable] &lt;br&gt;&amp;nbsp; public ref class CounterModel sealed : public Common::BindableBase {&lt;br&gt;&amp;nbsp; public:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;br&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; property Windows::UI::Xaml::Input::ICommand^ Increment &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { Windows::UI::Xaml::Input::ICommand^ get(); }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; property Windows::UI::Xaml::Input::ICommand^ Decrement &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { Windows::UI::Xaml::Input::ICommand^ get(); }&lt;br&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void clear();&lt;br&gt;&amp;nbsp; private:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void increment();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void decrement();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;br&gt;&amp;nbsp; };&lt;/font&gt;&lt;/p&gt;&lt;p&gt;cpp側では Windows::UI::Xaml::Input::ICommand を実装したインスタンスを返さにゃならんのだが、そいつがちとばかしメンドーです。&lt;br&gt;まずヘルパー・クラスを用意する。&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;// --- CounterModel.cpp&lt;br&gt;&lt;font color="#ff0000"&gt;namespace {&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff0000" face="Courier New"&gt;&amp;nbsp; delegate void Action(Object^ arg);&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff0000" face="Courier New"&gt;&amp;nbsp; ref class Command sealed : ICommand {&lt;br&gt;&amp;nbsp; public:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Command(Action^ action) { action_ = action; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; virtual void Execute(Object^ arg) { action_(arg); }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; virtual bool CanExecute(Object^ arg) { return true; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; virtual event EventHandler&lt;object^&gt;^ CanExecuteChanged;&lt;br&gt;&amp;nbsp; private:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Action^ action_;&lt;br&gt;&amp;nbsp; };&lt;/object^&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff0000" face="Courier New"&gt;}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;んでもって:&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;// --- CounterModel.cpp&lt;br&gt;namespace App1 {&lt;br&gt;&amp;nbsp; ...&lt;br&gt;&lt;font color="#ff0000"&gt;&amp;nbsp; ICommand^ CounterModel::Increment::get() {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return ref new Command(ref new Action([this](Object^ arg) { increment();}));&lt;br&gt;&amp;nbsp; }&lt;br&gt;&amp;nbsp; ICommand^ CounterModel::Decrement::get() {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return ref new Command(ref new Action([this](Object^ arg) { decrement();}));&lt;br&gt;&amp;nbsp; }&lt;br&gt;&lt;/font&gt;}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;「increment()/decrement() を呼び出す&lt;strong&gt;ラムダ式&lt;/strong&gt;」から起こした ICommand を返すって&lt;strong&gt;スンポー&lt;/strong&gt;ですな。&lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/episteme/aggbug/327449.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>[C++/CX] Popup Dialog</title><link>http://blogs.wankuma.com/episteme/archive/2013/04/06/326411.aspx</link><pubDate>Sat, 06 Apr 2013 19:13:00 GMT</pubDate><guid>http://blogs.wankuma.com/episteme/archive/2013/04/06/326411.aspx</guid><wfw:comment>http://blogs.wankuma.com/episteme/comments/326411.aspx</wfw:comment><comments>http://blogs.wankuma.com/episteme/archive/2013/04/06/326411.aspx#Feedback</comments><slash:comments>245</slash:comments><wfw:commentRss>http://blogs.wankuma.com/episteme/comments/commentRss/326411.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/episteme/services/trackbacks/326411.aspx</trackback:ping><description>&lt;p&gt;ストアアプリは&lt;strong&gt;キホン全画面&lt;/strong&gt;なのでいわゆるダイアログの出番がありません。&lt;br&gt;あるにはあるけど簡単な確認ダイアログの類。こんなの。&lt;br&gt;&lt;img src="http://www1.c3-net.ne.jp/episteme/images/cppcx_5th/step1.png"&gt;&lt;/p&gt;&lt;p&gt;座標固定だからこいつの実装は前回のPopupより楽。&lt;br&gt;前回の Tappedイベントハンドラの&lt;strong&gt;ナカミを差し替え&lt;/strong&gt;ます。&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;void App1::TrialPage::txtCount_Tapped(Object^ sender, TappedRoutedEventArgs^ e) {&lt;br&gt;&amp;nbsp; auto action = [this](IUICommand^ command){ count_.clear(); };&lt;br&gt;&lt;font color="#ff0000"&gt;&amp;nbsp; MessageDialog^ msg = ref new MessageDialog(L"クリアして差し上げてもよくってよ");&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff0000" face="Courier New"&gt;&amp;nbsp; UICommand^ yesCmd = ref new UICommand(L"おねしゃす",&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ref new UICommandInvokedHandler(action));&lt;br&gt;&amp;nbsp; UICommand^ noCmd&amp;nbsp; = ref new UICommand(L"遠慮します"); &lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff0000" face="Courier New"&gt;&lt;font color="#008000"&gt;&amp;nbsp; // 上記コマンドをダイアログに追加&lt;br&gt;&lt;/font&gt;&amp;nbsp; msg-&amp;gt;Commands-&amp;gt;Append(yesCmd);&lt;br&gt;&amp;nbsp; msg-&amp;gt;Commands-&amp;gt;Append(noCmd);&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff0000" face="Courier New"&gt;&lt;font color="#008000"&gt;&amp;nbsp; // デフォルトおよびキャンセル時のコマンド・インデックス&lt;br&gt;&lt;/font&gt;&amp;nbsp; msg-&amp;gt;DefaultCommandIndex = 1;&lt;br&gt;&amp;nbsp; msg-&amp;gt;CancelCommandIndex = 1;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;font color="#ff0000"&gt;&lt;font color="#008000"&gt;&amp;nbsp; // ダイアログ表示&lt;br&gt;&lt;/font&gt;&amp;nbsp; msg-&amp;gt;ShowAsync();&lt;br&gt;&lt;/font&gt;}&lt;br&gt;&lt;/font&gt;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/episteme/aggbug/326411.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>[C++/CX] PopupMenuを追加する</title><link>http://blogs.wankuma.com/episteme/archive/2013/04/05/326006.aspx</link><pubDate>Fri, 05 Apr 2013 23:43:00 GMT</pubDate><guid>http://blogs.wankuma.com/episteme/archive/2013/04/05/326006.aspx</guid><wfw:comment>http://blogs.wankuma.com/episteme/comments/326006.aspx</wfw:comment><comments>http://blogs.wankuma.com/episteme/archive/2013/04/05/326006.aspx#Feedback</comments><slash:comments>230</slash:comments><wfw:commentRss>http://blogs.wankuma.com/episteme/comments/commentRss/326006.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/episteme/services/trackbacks/326006.aspx</trackback:ping><description>&lt;p&gt;ストアアプリの鬼門(?)、非同期処理とやらをちょっとばかり。&lt;br&gt;&lt;br&gt;カウント値をタップすると[クリア」メニューをぺろっと出します。&lt;br&gt;&lt;img src="http://www1.c3-net.ne.jp/episteme/images/cppcx_4th/step1.png"&gt;&lt;/p&gt;&lt;p&gt;ともあれCounterModelにclear()メソッドを追加して:&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;//--- CounterModel.h&lt;br&gt;&amp;nbsp; [Windows::UI::Xaml::Data::Bindable] &lt;br&gt;&amp;nbsp; public ref class CounterModel sealed : public Common::BindableBase {&lt;br&gt;&amp;nbsp; public:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#ff0000"&gt;void clear();&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;br&gt;&amp;nbsp; };&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;//--- CounterModel.cpp&lt;br&gt;...&lt;br&gt;&lt;font color="#ff0000"&gt;&amp;nbsp; void CounterModel::clear() { &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; value_ = 0; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; OnPropertyChanged(L"Count"); &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; addLog(L"ちゃら"); &lt;br&gt;&amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;しかるのち TextBlock に Tapped イベントハンドラを打ち込みます。&lt;br&gt;&lt;img src="http://www1.c3-net.ne.jp/episteme/images/cppcx_4th/step2.png"&gt;&lt;/p&gt;&lt;p&gt;イベントハンドラ ではタップされたコントロールの位置(=PopupMenu表示位置)を求めるヘルパ関数を用意。&lt;br&gt;MSDNのサンプルコードから拝借しました。&lt;/p&gt;&lt;p&gt;&lt;font color="#ff0000" face="Courier New"&gt;namespace {&lt;br&gt;&amp;nbsp; Rect GetElementRect(FrameworkElement^ element) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; GeneralTransform^ buttonTransform = element-&amp;gt;TransformToVisual(nullptr);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; const Point pointOrig(0, 0);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; const Point pointTransformed = buttonTransform-&amp;gt;TransformPoint(pointOrig);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; const Rect rect(pointTransformed.X, pointTransformed.Y, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; safe_cast&amp;lt;float&amp;gt;(element-&amp;gt;ActualWidth), &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; safe_cast&amp;lt;float&amp;gt;(element-&amp;gt;ActualHeight));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return rect;&lt;br&gt;&amp;nbsp; } &lt;br&gt;}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;C#/VBではこーゆーのをstaticメソッドにするんだろけども、&lt;br&gt;C++なら&lt;strong&gt;関係ないものは関係ないとこ&lt;/strong&gt;にぽつんと置けるのが潔くてよろしいですな。&lt;/p&gt;&lt;p&gt;んでもってハンドラ本体。&lt;br&gt;&lt;font color="#ff0000" face="Courier New"&gt;using namespace Windows::UI::Popups;&lt;/font&gt;&amp;nbsp; を追加して:&lt;/p&gt;&lt;p&gt;&lt;font color="#ff0000" face="Courier New"&gt;void App1::TrialPage::txtCount_Tapped(Object^ sender, TappedRoutedEventArgs^ e) {&lt;br&gt;&amp;nbsp; auto action = [this](IUICommand^ command){ count_.clear(); }; &lt;font color="#008000"&gt;// 押されたらクリア&lt;/font&gt;&lt;br&gt;&amp;nbsp; auto menu = ref new PopupMenu();&lt;br&gt;&amp;nbsp; menu-&amp;gt;Commands-&amp;gt;Append(ref new UICommand(L"クリア", &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ref new UICommandInvokedHandler(action)));&lt;br&gt;&amp;nbsp; menu-&amp;gt;ShowForSelectionAsync(GetElementRect(safe_cast&amp;lt;FrameworkElement^&amp;gt;(sender)));&lt;br&gt;&amp;nbsp; &lt;font color="#008000"&gt;// ↑ココが非同期。完了を待たずに"するっ"と抜ける。(クリア処理は舞台裏)&lt;/font&gt;&lt;br&gt;}&lt;br&gt;&lt;/font&gt;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/episteme/aggbug/326006.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>「C++/CX] C++/CX は C++11/CX なのか?</title><link>http://blogs.wankuma.com/episteme/archive/2013/04/03/324850.aspx</link><pubDate>Wed, 03 Apr 2013 05:23:00 GMT</pubDate><guid>http://blogs.wankuma.com/episteme/archive/2013/04/03/324850.aspx</guid><wfw:comment>http://blogs.wankuma.com/episteme/comments/324850.aspx</wfw:comment><comments>http://blogs.wankuma.com/episteme/archive/2013/04/03/324850.aspx#Feedback</comments><slash:comments>66</slash:comments><wfw:commentRss>http://blogs.wankuma.com/episteme/comments/commentRss/324850.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/episteme/services/trackbacks/324850.aspx</trackback:ping><description>&lt;p&gt;そゆわけで片方向(データ→コントロール)の紐付けができたところでこれ以上は深入りしないことに。&lt;br&gt;と言いますのも、僕はストアアプリが書きたいんじゃなく、C++/CXをいぢくり回したいわけで。&lt;br&gt;C++ならコンソールアプリで済ますわけだがC++/CXだと今んとこストアアプリ限定なもんだから&lt;br&gt;コンソールI/Oの代替をこしらえたかったってことっす。&lt;/p&gt;&lt;p&gt;んで、ここらへんでそろそろC++11の機能がC++/CXでも活きるのかためしてみんよ。&lt;br&gt;Visual C++ Compiler 2012 CTP　　&lt;a href="http://codezine.jp/article/detail/7061"&gt;http://codezine.jp/article/detail/7061&lt;/a&gt;&lt;br&gt;をインストールしてこんなコードを追加しました。&lt;/p&gt;&lt;p&gt;&lt;font size="2" face="Courier New"&gt;// ---- VectorWriter.h&lt;br&gt;#pragma once&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2" face="Courier New"&gt;#include &amp;lt;sstream&amp;gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2" face="Courier New"&gt;namespace App1 {&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2" face="Courier New"&gt;&amp;nbsp; std::wostream&amp;amp; operator&amp;lt;&amp;lt;(std::wostream&amp;amp; stream, Platform::Object^ arg);&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2" face="Courier New"&gt;&amp;nbsp; class VectorWriter {&lt;br&gt;&amp;nbsp; public:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; VectorWriter(Windows::Foundation::Collections::IVector&amp;lt;Platform::String^&amp;gt;^ vec) : vec_(vec) {}&lt;br&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; template&amp;lt;typename Tcar, typename ...Tcdr&amp;gt; void write(Tcar head, Tcdr ...tail) { stream_ &amp;lt;&amp;lt; head; write(tail...); }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; template&amp;lt;typename ...T&amp;gt; void writeln(T ...args) { write(args...); writeln(); }&lt;br&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void write() {}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void writeln();&lt;br&gt;&amp;nbsp; private:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; std::wostringstream stream_;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Windows::Foundation::Collections::IVector&amp;lt;Platform::String^&amp;gt;^ vec_;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp; };&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2" face="Courier New"&gt;}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2" face="Courier New"&gt;// --- VectorWriter.cpp&lt;br&gt;#include "pch.h"&lt;br&gt;#include "VectorWriter.h"&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2" face="Courier New"&gt;namespace App1 {&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2" face="Courier New"&gt;&amp;nbsp; std::wostream&amp;amp; operator&amp;lt;&amp;lt;(std::wostream&amp;amp; stream, Platform::Object^ arg) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return stream &amp;lt;&amp;lt; arg-&amp;gt;ToString()-&amp;gt;Data();&lt;br&gt;&amp;nbsp; }&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2" face="Courier New"&gt;&amp;nbsp; void VectorWriter::writeln() {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; vec_-&amp;gt;Append(ref new Platform::String(stream_.str().c_str()));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; stream_.str(L"");&lt;br&gt;&amp;nbsp; }&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2" face="Courier New"&gt;}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;そ。Variadic Templates ね。んでもって CounterModel::addLog() がこーなる:&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&amp;nbsp; void CounterModel::addLog(const wchar_t* op) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DateTimeFormatting::DateTimeFormatter datefmt(L"shortdate");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DateTimeFormatting::DateTimeFormatter timefmt(L"shorttime");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DateTime dt = Calendar().GetDateTime();&lt;br&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; VectorWriter writer(%history_);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; writer.writeln(datefmt.Format(dt), L' ', timefmt.Format(dt), L' ', op);&lt;br&gt;&lt;/font&gt;&amp;nbsp; }&lt;/font&gt;&lt;/p&gt;&lt;p&gt;うれしいことに動いてくれちゃったりするわけだ。&lt;br&gt;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/episteme/aggbug/324850.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>C++/CX: データとコントロールの紐付け(そのに)</title><link>http://blogs.wankuma.com/episteme/archive/2013/03/31/324021.aspx</link><pubDate>Sun, 31 Mar 2013 21:24:00 GMT</pubDate><guid>http://blogs.wankuma.com/episteme/archive/2013/03/31/324021.aspx</guid><wfw:comment>http://blogs.wankuma.com/episteme/comments/324021.aspx</wfw:comment><comments>http://blogs.wankuma.com/episteme/archive/2013/03/31/324021.aspx#Feedback</comments><slash:comments>63</slash:comments><wfw:commentRss>http://blogs.wankuma.com/episteme/comments/commentRss/324021.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/episteme/services/trackbacks/324021.aspx</trackback:ping><description>&lt;p&gt;ついでに値の列を紐付けるよ。&lt;/p&gt;&lt;p&gt;増加/減少した履歴を表示してみる。こんなの。&lt;/p&gt;&lt;p&gt;&lt;img src="http://www1.c3-net.ne.jp/episteme/images/cppcx_3rd/step1.png"&gt;&lt;/p&gt;&lt;p&gt;TrialPage.xamlにListBoxを貼り、ItemsSource属性を "{Binding History}" とします。&lt;br&gt;TextBlockと同様、"ナカミは紐付け元のHistoryプロパティからもらうよ"てことな。&lt;br&gt;&lt;br&gt;&lt;img src="http://www1.c3-net.ne.jp/episteme/images/cppcx_3rd/step2.png"&gt;&lt;/p&gt;&lt;p&gt;あとは CounterModelにHistoryプロパティを用意すりゃえぇです。&lt;br&gt;プロパティの型は&amp;nbsp; Windows::Foundation::Collections::IVector&amp;lt;&amp;gt; &lt;br&gt;こいつは interface なんで、メンバとしては IVector&amp;lt;&amp;gt;を実装した Vector&amp;lt;&amp;gt; を使うです。&lt;br&gt;&lt;img src="http://www1.c3-net.ne.jp/episteme/images/cppcx_3rd/step3.png"&gt;&lt;/p&gt;&lt;p&gt;実装はこんなもんでえぇじゃろ。&lt;br&gt;&lt;font face="Courier New"&gt;// --- CounterModel.cpp&lt;br&gt;#include "pch.h"&lt;br&gt;#include "CounterModel.h"&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;using namespace Platform;&lt;br&gt;using namespace Windows::Globalization;&lt;br&gt;using namespace Windows::Foundation;&lt;br&gt;using namespace Windows::Foundation::Collections;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;namespace App1 {&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&amp;nbsp; CounterModel::CounterModel() : value_(0) {}&lt;br&gt;&amp;nbsp; int CounterModel::Count::get() { return value_; }&lt;br&gt;&amp;nbsp; void CounterModel::increment() {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ++value_; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; OnPropertyChanged(L"Count"); &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#ff0000"&gt;addLog(L"ふえた");&lt;/font&gt; &lt;br&gt;&amp;nbsp; }&lt;br&gt;&amp;nbsp; void CounterModel::decrement() { &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --value_; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; OnPropertyChanged(L"Count"); &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#ff0000"&gt;addLog(L"へった");&lt;/font&gt; &lt;br&gt;&amp;nbsp; }&lt;br&gt;&amp;nbsp; &lt;font color="#ff0000"&gt;void CounterModel::addLog(String^ op) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DateTimeFormatting::DateTimeFormatter datefmt(L"shortdate");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DateTimeFormatting::DateTimeFormatter timefmt(L"shorttime");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Calendar cal;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DateTime dt = cal.GetDateTime();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; history_.Append(datefmt.Format(dt) + L" " + timefmt.Format(dt) + L" " + op);&lt;br&gt;&amp;nbsp; }&lt;br&gt;&amp;nbsp; IVector&amp;lt;Platform::String^&amp;gt;^ CounterModel::History::get() { return %history_; }&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;Vector&amp;lt;&amp;gt;は要素が追加/削除されるたびに勝手に"変更したよー"て通知を紐付け先に飛ばしてくれます。&lt;br&gt;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/episteme/aggbug/324021.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>C++/CX: データとコントロールの紐付け</title><link>http://blogs.wankuma.com/episteme/archive/2013/03/31/323988.aspx</link><pubDate>Sun, 31 Mar 2013 11:48:00 GMT</pubDate><guid>http://blogs.wankuma.com/episteme/archive/2013/03/31/323988.aspx</guid><wfw:comment>http://blogs.wankuma.com/episteme/comments/323988.aspx</wfw:comment><comments>http://blogs.wankuma.com/episteme/archive/2013/03/31/323988.aspx#Feedback</comments><slash:comments>59</slash:comments><wfw:commentRss>http://blogs.wankuma.com/episteme/comments/commentRss/323988.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/episteme/services/trackbacks/323988.aspx</trackback:ping><description>&lt;p&gt;さてとーちょっくらいぢくるよ。&lt;/p&gt;&lt;p&gt;前回のコード、ここいらへん↓の居心地がよくない。&lt;/p&gt;&lt;p&gt;&lt;font size="2" face="Courier New"&gt;void App1::TrialPage::btnInc_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)&lt;br&gt;{&lt;br&gt;&amp;nbsp; ++count_;&lt;br&gt;&amp;nbsp; &lt;font color="#ff0000"&gt;txtCount-&amp;gt;Text = count_.ToString();&lt;/font&gt;&lt;br&gt;&lt;/font&gt;&lt;font size="2" face="Courier New"&gt;}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;ロジック内に画面の面倒を見る処理が&lt;strong&gt;混入&lt;/strong&gt;してます。できることならカウンタ値を+/-するだけで画面上の値が&lt;strong&gt;勝手にぴょこぴょこ&lt;/strong&gt;更新されるとステキ。それやってみましょ。&lt;br&gt;データ・バインディングといわれるやつですな。&lt;strong&gt;データ束縛&lt;/strong&gt;と訳されてたりするけども、"束縛"ちゅーとほのかに&lt;strong&gt;淫靡な香り&lt;/strong&gt;が漂います。なんかこー&lt;strong&gt;ぎりぎり&lt;/strong&gt;と縛り上げていたぶるみたいで..."紐付け"の方がまだマシな気が。&lt;/p&gt;&lt;p&gt;TrialPage.xaml状にあるTextBlockのText属性を書き換えます:&lt;br&gt;&lt;img src="http://www1.c3-net.ne.jp/episteme/images/cppcx_2nd/step1.png"&gt;&lt;/p&gt;&lt;p&gt;"{Binding Count}" が「紐付け元にあるCountプロパティの値を置け」ちう意味ですな。&lt;br&gt;んで、Countプロパティを提供する"紐付け元"をこさえます。&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;// --- CounterModel.h&lt;br&gt;#pragma once&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;#include "Common/BindableBase.h"&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;namespace App1 { &lt;font color="#008000"&gt;// この名前空間はプロジェクト名に合わせる&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&amp;nbsp; &lt;font color="#ff0000"&gt;[Windows::UI::Xaml::Data::Bindable]&lt;/font&gt; &lt;br&gt;&amp;nbsp; public ref class CounterModel sealed &lt;font color="#ff0000"&gt;: public Common::BindableBase&lt;/font&gt; {&lt;br&gt;&amp;nbsp; public:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CounterModel();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; property int Count { int get(); }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void increment();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void decrement();&lt;br&gt;&amp;nbsp; private:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int value_;&lt;br&gt;&amp;nbsp; };&lt;br&gt;}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;ここでのキモはふたつ:&lt;br&gt;- [Windows::UI::Xaml::Data::Bindable] てなアトリビュートを付けること。このクラスは&lt;strong&gt;紐付け可能&lt;/strong&gt;であることを示します。&lt;br&gt;- Common::BindableBase から導出すること。BindableBaseが紐付けに必要な&lt;strong&gt;モロモロ&lt;/strong&gt;を提供してくれるのな。&lt;/p&gt;&lt;p&gt;CounterModel の実装はこんなカンジ。&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;// --- CounterModel.cpp&lt;br&gt;#include "pch.h"&lt;br&gt;#include "CounterModel.h"&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;namespace App1 { &lt;font color="#008000"&gt;// この名前空間はプロジェクト名に合わせる&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&amp;nbsp; CounterModel::CounterModel() : value_(0) {}&lt;br&gt;&amp;nbsp; int CounterModel::Count::get() { return value_; }&lt;br&gt;&amp;nbsp; void CounterModel::increment() { ++value_; &lt;font color="#ff0000"&gt;OnPropertyChanged(L"Count");&lt;/font&gt; }&lt;br&gt;&amp;nbsp; void CounterModel::decrement() { --value_; &lt;font color="#ff0000"&gt;OnPropertyChanged(L"Count");&lt;/font&gt; }&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;OnPropertyChanged(L"Count") が"Countプロパティが&lt;strong&gt;変更されたよー&lt;/strong&gt;"と紐付け先に通知してくれます。通知を受けたXAMLさんはそいじゃってんでCountプロパティを読み取って&lt;strong&gt;絵ヅラを描き換える&lt;/strong&gt;ってスンポーです。&lt;/p&gt;&lt;p&gt;TrialPage.xaml.h をちょっとだけいぢり、int count_ を CounterModel^ count_ に取り替えます。&lt;br&gt;&lt;img src="http://www1.c3-net.ne.jp/episteme/images/cppcx_2nd/step2.png"&gt;&lt;/p&gt;&lt;p&gt;実装側(TrialPage.xaml.cpp)は...&lt;/p&gt;&lt;p&gt;&lt;font size="2" face="Courier New"&gt;TrialPage::TrialPage()&lt;br&gt;{&lt;br&gt;&amp;nbsp; InitializeComponent();&lt;br&gt;&amp;nbsp; &lt;font color="#ff0000"&gt;count_ = ref new CounterModel();&lt;br&gt;&amp;nbsp; DataContext = count_;&lt;br&gt;&lt;/font&gt;}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2" face="Courier New"&gt;void App1::TrialPage::btnInc_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)&lt;br&gt;{&lt;br&gt;&amp;nbsp; &lt;font color="#ff0000"&gt;count_-&amp;gt;increment();&lt;/font&gt;&lt;br&gt;}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size="2" face="Courier New"&gt;void App1::TrialPage::btnDec_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)&lt;br&gt;{&lt;br&gt;&amp;nbsp; &lt;font color="#ff0000"&gt;count_-&amp;gt;decrement();&lt;/font&gt;&lt;br&gt;}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;コンストラクタでDataCountextをセットすることで紐付け先(XAMLさん)に紐付け元(CounterModel)を教えてあげてます。これで完成。動くハズよ。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/episteme/aggbug/323988.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>C++/CX: はじめてのストアアプリ</title><link>http://blogs.wankuma.com/episteme/archive/2013/03/31/323951.aspx</link><pubDate>Sun, 31 Mar 2013 00:01:00 GMT</pubDate><guid>http://blogs.wankuma.com/episteme/archive/2013/03/31/323951.aspx</guid><wfw:comment>http://blogs.wankuma.com/episteme/comments/323951.aspx</wfw:comment><comments>http://blogs.wankuma.com/episteme/archive/2013/03/31/323951.aspx#Feedback</comments><slash:comments>331</slash:comments><wfw:commentRss>http://blogs.wankuma.com/episteme/comments/commentRss/323951.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/episteme/services/trackbacks/323951.aspx</trackback:ping><description>&lt;p&gt;C++/CLI の次は C++/CX ですか...&lt;/p&gt;&lt;p&gt;επιστημηといたしましては、C++/CXには少なからず期待しています。&lt;br&gt;だってアナタ、&lt;strong&gt;nativeだっつー&lt;/strong&gt;じゃないですか。&lt;/p&gt;&lt;p&gt;C++/CLIはmanagedなんでref-classの&lt;strong&gt;縛りがキツかった&lt;/strong&gt;んですわ。ref-class内にnativeなメンバを置けないとかref-classがstd::vectorの要素になれないとか。&lt;br&gt;対してC++/CXのref-classはnativeだという。ならばC++/CLIでのきっつい縛りが相当緩和されるに違いない、と。&lt;br&gt;んだもんで遅ればせながらC++/CXでしばらく遊んでみようかと&lt;strong&gt;本日突然&lt;/strong&gt;思い立ったわけですわ。&lt;br&gt;つってもC++/CXで書けるのはストアアプリだけとのことなんで、まずはC++/CXで遊ぶべくストアアプリに慣れるとこから着手するです。&lt;/p&gt;&lt;p&gt;GUIのお試しに僕が決まって作るのは「Counter」...まずはとにかく雛形を用意するとこから。Windowsストアアプリ:「新しいアプリケーション」を選択。&lt;br&gt;&lt;img src="http://www1.c3-net.ne.jp/episteme/images/cppcx_1st/step1.png"&gt;&lt;/p&gt;&lt;p&gt;わしゃわしゃとコードが吐かれ、その中にMainPage.xaml(h,cpp)があるけども、ここで一枚新たなページを作ります。プロジェクト→新しい項目の追加 から Windowsストア:「基本ページ」で TrialPage.xaml を吐いてもらいます。なんか&lt;strong&gt;見慣れぬダイアログ&lt;/strong&gt;が上がってくるけど構わず[はい]って答えとく。&lt;br&gt;&lt;img src="http://www1.c3-net.ne.jp/episteme/images/cppcx_1st/step2.png"&gt;&lt;br&gt;&lt;img src="http://www1.c3-net.ne.jp/episteme/images/cppcx_1st/step3.png"&gt;&lt;/p&gt;&lt;p&gt;CounterPageを主ページとすべく、App.xaml.cpp に現れる "MainPage" を "TrialPage" に差し替えます。&lt;br&gt;&lt;img src="http://www1.c3-net.ne.jp/episteme/images/cppcx_1st/step4.png"&gt;&lt;/p&gt;&lt;p&gt;ここで一度 build すれば MainPage.xamlなんちゃらは&lt;strong&gt;用済み&lt;/strong&gt;なので削除します。&lt;/p&gt;&lt;p&gt;んでもって CounterPage に TextBlock と Button をふたつ貼り付け、それぞれ txtCount, btnInc, btnDec と命名しました。&lt;br&gt;&lt;img src="http://www1.c3-net.ne.jp/episteme/images/cppcx_1st/step5.png"&gt;&lt;/p&gt;&lt;p&gt;ふたつのボタンに Click イベントハンドラをあてがい、TrialPage.xaml.h にある public ref class TrialPage sealed 内に private メンバ int count_ を追加し、TrialPage.xaml.cpp に加筆します:&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;TrialPage::TrialPage() &lt;font color="#ff0000"&gt;: &lt;strong&gt;count_(0)&lt;/strong&gt;&lt;/font&gt;&lt;br&gt;{&lt;br&gt;? InitializeComponent();&lt;br&gt;}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;void App1::TrialPage::btnInc_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)&lt;br&gt;{&lt;br&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;? ++count_;&lt;br&gt;? txtCount-&gt;Text = count_.ToString();&lt;br&gt;&lt;/font&gt;&lt;/strong&gt;}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;font face="Courier New"&gt;void App1::TrialPage::btnDec_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)&lt;br&gt;{&lt;br&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;? --count_;&lt;br&gt;? txtCount-&gt;Text = count_.ToString();&lt;br&gt;&lt;/font&gt;&lt;/strong&gt;}&lt;/font&gt;&lt;/p&gt;&lt;p&gt;こんなもんでいいかな、シミュレータで動かしてみましょ。&lt;br&gt;&lt;img src="http://www1.c3-net.ne.jp/episteme/images/cppcx_1st/step6.png"&gt;&lt;/p&gt;&lt;p&gt;よしよし。今日はこのへんで勘弁したらぁ。&lt;br&gt;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/episteme/aggbug/323951.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>Variadic Tempalte のスカした定義</title><link>http://blogs.wankuma.com/episteme/archive/2013/03/16/320653.aspx</link><pubDate>Sat, 16 Mar 2013 12:55:00 GMT</pubDate><guid>http://blogs.wankuma.com/episteme/archive/2013/03/16/320653.aspx</guid><wfw:comment>http://blogs.wankuma.com/episteme/comments/320653.aspx</wfw:comment><comments>http://blogs.wankuma.com/episteme/archive/2013/03/16/320653.aspx#Feedback</comments><slash:comments>201</slash:comments><wfw:commentRss>http://blogs.wankuma.com/episteme/comments/commentRss/320653.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/episteme/services/trackbacks/320653.aspx</trackback:ping><description>&lt;p&gt;C++11 には Variadic Template： 可変長テンプレートてーのがあってね、&lt;br&gt;template＜ココにいくつも型を書ける＞ ワケや。　腕試しに tuple をこしらえてみた:&lt;/p&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;font color="blue"&gt;#include&lt;/font&gt; &amp;lt;iostream&amp;gt;

&lt;font color="green"&gt;// [1] tuple_data&lt;/font&gt;
&lt;font color="blue"&gt;template&lt;/font&gt;&amp;lt;&lt;font color="blue"&gt;int&lt;/font&gt; N, &lt;font color="blue"&gt;typename&lt;/font&gt; ...T&amp;gt; &lt;font color="blue"&gt;struct&lt;/font&gt; tuple_data; 

&lt;font color="blue"&gt;template&lt;/font&gt;&amp;lt;&lt;font color="blue"&gt;int&lt;/font&gt; N&amp;gt; &lt;font color="blue"&gt;struct&lt;/font&gt; tuple_data&amp;lt;N&amp;gt; {}; 

&lt;font color="blue"&gt;template&lt;/font&gt;&amp;lt;&lt;font color="blue"&gt;int&lt;/font&gt; N, &lt;font color="blue"&gt;typename&lt;/font&gt; Tcar, &lt;font color="blue"&gt;typename&lt;/font&gt; ...Tcdr&amp;gt; 
&lt;font color="blue"&gt;struct&lt;/font&gt; tuple_data&amp;lt;N, Tcar, Tcdr...&amp;gt; : &lt;font color="blue"&gt;public&lt;/font&gt; tuple_data&amp;lt;N+1, Tcdr...&amp;gt; {
  &lt;font color="blue"&gt;typedef&lt;/font&gt; Tcar type; type value; 
};

&lt;font color="blue"&gt;template&lt;/font&gt;&amp;lt;&lt;font color="blue"&gt;typename&lt;/font&gt; ...T&amp;gt; &lt;font color="blue"&gt;struct&lt;/font&gt; tuple : &lt;font color="blue"&gt;public&lt;/font&gt; tuple_data&amp;lt;0, T...&amp;gt; {};

&lt;font color="green"&gt;// [2] tuple_type&lt;/font&gt;
&lt;font color="blue"&gt;template&lt;/font&gt;&amp;lt;&lt;font color="blue"&gt;int&lt;/font&gt; N, &lt;font color="blue"&gt;typename&lt;/font&gt; ...T&amp;gt; &lt;font color="blue"&gt;struct&lt;/font&gt; tuple_type; 
&lt;font color="blue"&gt;template&lt;/font&gt;&amp;lt;&lt;font color="blue"&gt;typename&lt;/font&gt; Tcar, &lt;font color="blue"&gt;typename&lt;/font&gt; ...Tcdr&amp;gt; 
&lt;font color="blue"&gt;struct&lt;/font&gt; tuple_type&amp;lt;0, Tcar, Tcdr...&amp;gt; { &lt;font color="blue"&gt;typedef&lt;/font&gt; Tcar type; }; 
&lt;font color="blue"&gt;template&lt;/font&gt;&amp;lt;&lt;font color="blue"&gt;int&lt;/font&gt; N, &lt;font color="blue"&gt;typename&lt;/font&gt; Tcar, &lt;font color="blue"&gt;typename&lt;/font&gt; ...Tcdr&amp;gt; &lt;font color="blue"&gt;struct&lt;/font&gt; tuple_type&amp;lt;N, Tcar, Tcdr...&amp;gt; { 
  &lt;font color="blue"&gt;typedef&lt;/font&gt; &lt;font color="blue"&gt;typename&lt;/font&gt; tuple_type&amp;lt;N-1, Tcdr...&amp;gt;::type type; 
};

&lt;font color="green"&gt;// [3] get&amp;lt;N&amp;gt;()&lt;/font&gt;
&lt;font color="blue"&gt;template&lt;/font&gt;&amp;lt;&lt;font color="blue"&gt;int&lt;/font&gt; N, &lt;font color="blue"&gt;typename&lt;/font&gt; Tcar, &lt;font color="blue"&gt;typename&lt;/font&gt; ...Tcdr&amp;gt; 
Tcar&amp;amp; get_data(tuple_data&amp;lt;N, Tcar, Tcdr...&amp;gt;&amp;amp; t) { &lt;font color="blue"&gt;return&lt;/font&gt; t.value; }

&lt;font color="blue"&gt;template&lt;/font&gt;&amp;lt;&lt;font color="blue"&gt;int&lt;/font&gt; N, &lt;font color="blue"&gt;typename&lt;/font&gt; ...T&amp;gt;
&lt;font color="blue"&gt;typename&lt;/font&gt; tuple_type&amp;lt;N, T...&amp;gt;::type&amp;amp; get(tuple&amp;lt;T...&amp;gt;&amp;amp; t) { &lt;font color="blue"&gt;return&lt;/font&gt; get_data&amp;lt;N&amp;gt;(t); }

&lt;font color="blue"&gt;using&lt;/font&gt; std::cout;
&lt;font color="blue"&gt;using&lt;/font&gt; std::endl;

&lt;font color="blue"&gt;int&lt;/font&gt; main() {
  tuple&amp;lt;&lt;font color="blue"&gt;int&lt;/font&gt;,&lt;font color="blue"&gt;long&lt;/font&gt;,&lt;font color="blue"&gt;char&lt;/font&gt;&amp;gt; t;
  get&amp;lt;0&amp;gt;(t) = 123;
  get&amp;lt;1&amp;gt;(t) = -456L;
  get&amp;lt;2&amp;gt;(t) = 'A';
  cout &amp;lt;&amp;lt; get&amp;lt;0&amp;gt;(t) &amp;lt;&amp;lt; get&amp;lt;1&amp;gt;(t) &amp;lt;&amp;lt; get&amp;lt;2&amp;gt;(t) &amp;lt;&amp;lt; endl; 
}
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;んーむ...[2] んトコがカッコよくない。 get＜n＞ が返す型がほしいって&lt;strong&gt;だけ&lt;/strong&gt;のために tuple_type を定義せんならんのがね。&lt;/p&gt;&lt;p&gt;ぐちゅぐちゅと格闘して数時間、コタエを見つけました。&lt;/p&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;font color="blue"&gt;template&lt;/font&gt;&amp;lt;&lt;font color="blue"&gt;int&lt;/font&gt; N, &lt;font color="blue"&gt;typename&lt;/font&gt; ...T&amp;gt; &lt;font color="blue"&gt;struct&lt;/font&gt; tuple_data;
&lt;font color="blue"&gt;template&lt;/font&gt;&amp;lt;&lt;font color="blue"&gt;int&lt;/font&gt; N&amp;gt; &lt;font color="blue"&gt;struct&lt;/font&gt; tuple_data&amp;lt;N&amp;gt; {};

&lt;font color="blue"&gt;template&lt;/font&gt;&amp;lt;&lt;font color="blue"&gt;int&lt;/font&gt; N, &lt;font color="blue"&gt;typename&lt;/font&gt; Tcar, &lt;font color="blue"&gt;typename&lt;/font&gt; ...Tcdr&amp;gt;
&lt;font color="blue"&gt;struct&lt;/font&gt; tuple_data&amp;lt;N, Tcar, Tcdr...&amp;gt; : &lt;font color="blue"&gt;public&lt;/font&gt; tuple_data&amp;lt;N+1, Tcdr...&amp;gt; {
  Tcar value;
};

&lt;font color="blue"&gt;template&lt;/font&gt;&amp;lt;&lt;font color="blue"&gt;typename&lt;/font&gt; ...T&amp;gt; &lt;font color="blue"&gt;struct&lt;/font&gt; tuple : &lt;font color="blue"&gt;public&lt;/font&gt; tuple_data&amp;lt;0, T...&amp;gt; {};

&lt;font color="blue"&gt;template&lt;/font&gt;&amp;lt;&lt;font color="blue"&gt;int&lt;/font&gt; N, &lt;font color="blue"&gt;typename&lt;/font&gt; Tcar, &lt;font color="blue"&gt;typename&lt;/font&gt; ...Tcdr&amp;gt;
Tcar&amp;amp; get_tuple_data(tuple_data&amp;lt;N, Tcar, Tcdr...&amp;gt;&amp;amp; t) { 
  &lt;font color="blue"&gt;return&lt;/font&gt; t.value; 
}

&lt;font color="blue"&gt;template&lt;/font&gt;&amp;lt;&lt;font color="blue"&gt;int&lt;/font&gt; N, &lt;font color="blue"&gt;typename&lt;/font&gt; ...T&amp;gt;
&lt;font color="blue"&gt;auto&lt;/font&gt; get(tuple&amp;lt;T...&amp;gt;&amp;amp; t) -&amp;gt; &lt;strong&gt;&lt;font color="#ff0000"&gt;decltype( get_tuple_data&amp;lt;N&amp;gt;(t) )&lt;/font&gt;&lt;/strong&gt; { // &amp;lt;- こんだけで tuple_type 不要!
  &lt;font color="blue"&gt;return&lt;/font&gt; get_tuple_data&amp;lt;N&amp;gt;(t); 
}

&lt;font color="blue"&gt;int&lt;/font&gt; main() {
  tuple&amp;lt;&lt;font color="blue"&gt;int&lt;/font&gt;,&lt;font color="blue"&gt;char&lt;/font&gt;,&lt;font color="blue"&gt;long&lt;/font&gt;&amp;gt; t;
  get&amp;lt;0&amp;gt;(t) = 123;
  get&amp;lt;1&amp;gt;(t) = 'A';
  get&amp;lt;2&amp;gt;(t) = -456L;
  std::cout &amp;lt;&amp;lt; get&amp;lt;0&amp;gt;(t) &amp;lt;&amp;lt; get&amp;lt;1&amp;gt;(t) &amp;lt;&amp;lt; get&amp;lt;2&amp;gt;(t) &amp;lt;&amp;lt; std::endl;
}
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;decltypeすげー&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/episteme/aggbug/320653.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>Visual C++ 11 の おっかないイテレータ</title><link>http://blogs.wankuma.com/episteme/archive/2013/01/11/311581.aspx</link><pubDate>Fri, 11 Jan 2013 04:46:00 GMT</pubDate><guid>http://blogs.wankuma.com/episteme/archive/2013/01/11/311581.aspx</guid><wfw:comment>http://blogs.wankuma.com/episteme/comments/311581.aspx</wfw:comment><comments>http://blogs.wankuma.com/episteme/archive/2013/01/11/311581.aspx#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://blogs.wankuma.com/episteme/comments/commentRss/311581.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/episteme/services/trackbacks/311581.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/hh409293.aspx"&gt;Visual C++ 11 の新しい機能&lt;/a&gt; のひとつに&lt;br&gt; 「SCARY iterator(おっかないイテレータ)」てーのを見つけましてね。&lt;br&gt;なんじゃそりゃ? ってんで調べてみた。&lt;/p&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;font color="blue"&gt;#include&lt;/font&gt; &amp;lt;iostream&amp;gt;
&lt;font color="blue"&gt;#include&lt;/font&gt; &amp;lt;functional&amp;gt;
&lt;font color="blue"&gt;#include&lt;/font&gt; &amp;lt;set&amp;gt;
&lt;font color="blue"&gt;#include&lt;/font&gt; &amp;lt;typeinfo&amp;gt;

&lt;font color="blue"&gt;using&lt;/font&gt; &lt;font color="blue"&gt;namespace&lt;/font&gt; std;

&lt;font color="blue"&gt;int&lt;/font&gt; main() {
  set&amp;lt;&lt;font color="blue"&gt;int&lt;/font&gt;,&lt;font color="#ff0000"&gt;less&amp;lt;int&amp;gt;&lt;/font&gt;&amp;gt;    a;
  set&amp;lt;&lt;font color="blue"&gt;int&lt;/font&gt;,&lt;font color="#ff0000"&gt;greater&amp;lt;int&amp;gt;&lt;/font&gt;&amp;gt; b;
  cout &amp;lt;&amp;lt; &lt;font color="blue"&gt;typeid&lt;/font&gt;(a.begin()).name() &amp;lt;&amp;lt; endl;
  cout &amp;lt;&amp;lt; &lt;font color="blue"&gt;typeid&lt;/font&gt;(b.begin()).name() &amp;lt;&amp;lt; endl;
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;コレ↑をvc10(Visual Studio 2010) で実行すると:&lt;br&gt;&lt;font size="2" face="Courier New"&gt;class std::_Tree_const_iterator&amp;lt;class std::_Tree_val&amp;lt;class std::_Tset_traits&amp;lt;int,struct&lt;font color="#ff0000"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;std::less&amp;lt;int&amp;gt;,class std::allocator&amp;lt;int&amp;gt;&lt;/strong&gt;&lt;/font&gt;,0&amp;gt; &amp;gt; &amp;gt;&lt;br&gt;class std::_Tree_const_iterator&amp;lt;class std::_Tree_val&amp;lt;class std::_Tset_traits&amp;lt;int,struct &lt;br&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;std::greater&amp;lt;int&amp;gt;,class std::allocator&amp;lt;int&amp;gt;&lt;/strong&gt;&lt;/font&gt;,0&amp;gt; &amp;gt; &amp;gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Arial"&gt;イテレータ型の中に比較オブジェクト(とアロケータ)が埋め込まれてて、両者は&lt;strong&gt;別物&lt;/strong&gt;です。&lt;/font&gt;&lt;/p&gt;&lt;p&gt;一方vc11(Visual Studio 2012)だと:&lt;br&gt;&lt;font size="2" face="Courier New"&gt;class std::_Tree_const_iterator&amp;lt;class std::_Tree_val&amp;lt;struct std::_Tree_simple_types&amp;lt;int&amp;gt; &amp;gt; &amp;gt;&lt;br&gt;class std::_Tree_const_iterator&amp;lt;class std::_Tree_val&amp;lt;struct std::_Tree_simple_types&amp;lt;int&amp;gt; &amp;gt; &amp;gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;両者の型は&lt;strong&gt;同じ&lt;/strong&gt;なの。&lt;br&gt;ってことは、要素の型が同じなら(比較オブジェクト/アロケータがどうであれ)ひとつのイテレータを使いまわせます。&lt;br&gt;&lt;br&gt;&lt;font face="Courier New"&gt;set&amp;lt;X,なんやら&amp;gt; a;&lt;br&gt;set&amp;lt;X,かんやら&amp;gt; b;&lt;br&gt;set&amp;lt;X&amp;gt;::iterator iter;&lt;br&gt;iter = a.begin(); // ok&lt;br&gt;iter = b.begin(); // ok&lt;br&gt;&lt;/font&gt;&lt;br&gt;...なるほどね。&lt;br&gt;ときにこの" SCARY"なんだが、これの書かれたドキュメント&lt;a href="http://www.open-std.org/jtc1/sc22/WG21/docs/papers/2009/n2980.pdf"&gt;N2980&lt;/a&gt;によると:&lt;blockquote&gt;N2911 explains that the acronym SCARY &amp;#8220;describes assignments and initializations that are &lt;font color="#ff0000"&gt;S&lt;/font&gt;eemingly erroneous (&lt;font color="#ff0000"&gt;C&lt;/font&gt;onstrained by conflicting generic parameters), but &lt;font color="#ff0000"&gt;A&lt;/font&gt;ctually work with the &lt;font color="#ff0000"&gt;R&lt;/font&gt;ight implementation (unconstrained b&lt;font color="#ff0000"&gt;Y&lt;/font&gt; the conflict due to minimized dependencies).&amp;#8221;&lt;br&gt;&lt;strong&gt;ぱっと見マチガイみたいだけどちゃんと動くからいいじゃない&lt;/strong&gt;&lt;/blockquote&gt;&lt;br&gt;てゆー、めちゃめちゃ苦しいアクロニムなんだとさ。&lt;img src ="http://blogs.wankuma.com/episteme/aggbug/311581.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>今年もよろしくお願いいたしまするー</title><link>http://blogs.wankuma.com/episteme/archive/2013/01/01/310524.aspx</link><pubDate>Tue, 01 Jan 2013 16:45:00 GMT</pubDate><guid>http://blogs.wankuma.com/episteme/archive/2013/01/01/310524.aspx</guid><wfw:comment>http://blogs.wankuma.com/episteme/comments/310524.aspx</wfw:comment><comments>http://blogs.wankuma.com/episteme/archive/2013/01/01/310524.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/episteme/comments/commentRss/310524.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/episteme/services/trackbacks/310524.aspx</trackback:ping><description>&lt;p&gt;Microsoft &lt;strong&gt;MVP for Visual C++&lt;/strong&gt;&lt;br&gt;&lt;strong&gt;今年も&lt;/strong&gt;いただきましたですよ。&lt;br&gt;これでまた一年、&lt;strong&gt;エラソー&lt;/strong&gt;な顔していられます。&lt;br&gt;
&lt;img src="http://www1.c3-net.ne.jp/episteme/images/mvp.png"&gt;&lt;/p&gt;
&lt;p&gt;2004年に在りし頃のC-magazine編集さんに推薦もらっての受賞以来、&lt;br&gt;なんだかんだで&lt;strong&gt;１０年連続&lt;/strong&gt;、我ながらスゴイネー♪&lt;/p&gt;&lt;p&gt;面白そげな言語やらライブラリやらちびちびつまみ食いしつつも、&lt;br&gt;&lt;strong&gt;キホンC++&lt;/strong&gt;でゆるーく遊んでいけたらいいなーと。&lt;/p&gt;&lt;p&gt;んでもって「ええ歳こいたじじぃがなんかおもろいことやっとるなー」と、&lt;br&gt;若い衆の刺激になれば幸甚ﾅﾘ。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/episteme/aggbug/310524.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>Hit&amp;Blow お化粧直し</title><link>http://blogs.wankuma.com/episteme/archive/2012/12/28/310396.aspx</link><pubDate>Fri, 28 Dec 2012 01:55:00 GMT</pubDate><guid>http://blogs.wankuma.com/episteme/archive/2012/12/28/310396.aspx</guid><wfw:comment>http://blogs.wankuma.com/episteme/comments/310396.aspx</wfw:comment><comments>http://blogs.wankuma.com/episteme/archive/2012/12/28/310396.aspx#Feedback</comments><slash:comments>35</slash:comments><wfw:commentRss>http://blogs.wankuma.com/episteme/comments/commentRss/310396.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/episteme/services/trackbacks/310396.aspx</trackback:ping><description>&lt;p&gt;んーと、これでちっとはC++らしくなったかな。&lt;/p&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;font color="blue"&gt;#include&lt;/font&gt; &amp;lt;iostream&amp;gt;
&lt;font color="blue"&gt;#include&lt;/font&gt; &amp;lt;string&amp;gt;
&lt;font color="blue"&gt;#include&lt;/font&gt; &amp;lt;array&amp;gt;
&lt;font color="blue"&gt;#include&lt;/font&gt; &amp;lt;vector&amp;gt;
&lt;font color="blue"&gt;#include&lt;/font&gt; &amp;lt;algorithm&amp;gt;
&lt;font color="blue"&gt;#include&lt;/font&gt; &amp;lt;utility&amp;gt;
&lt;font color="blue"&gt;#include&lt;/font&gt; &amp;lt;iterator&amp;gt;

&lt;font color="blue"&gt;using&lt;/font&gt; &lt;font color="blue"&gt;namespace&lt;/font&gt; std;

&lt;font color="blue"&gt;const&lt;/font&gt; &lt;font color="blue"&gt;int&lt;/font&gt; N = 3;

&lt;font color="green"&gt;// N桁の数&lt;/font&gt;
&lt;font color="blue"&gt;typedef&lt;/font&gt; array&amp;lt;&lt;font color="blue"&gt;int&lt;/font&gt;,N&amp;gt; number;

ostream&amp;amp; &lt;font color="blue"&gt;operator&lt;/font&gt;&amp;lt;&amp;lt;(ostream&amp;amp; stream, &lt;font color="blue"&gt;const&lt;/font&gt; number&amp;amp; n) {
  for_each(begin(n),end(n),[&amp;amp;](&lt;font color="blue"&gt;int&lt;/font&gt; n) { stream &amp;lt;&amp;lt; n;});
  &lt;font color="blue"&gt;return&lt;/font&gt; stream;
} 

&lt;font color="green"&gt;// Hit/Blowの組&lt;/font&gt;
&lt;font color="blue"&gt;typedef&lt;/font&gt; pair&amp;lt;&lt;font color="blue"&gt;int&lt;/font&gt;,&lt;font color="blue"&gt;int&lt;/font&gt;&amp;gt; hb;

ostream&amp;amp; &lt;font color="blue"&gt;operator&lt;/font&gt;&amp;lt;&amp;lt;(ostream&amp;amp; stream, &lt;font color="blue"&gt;const&lt;/font&gt; hb&amp;amp; h) {
  &lt;font color="blue"&gt;return&lt;/font&gt; stream &amp;lt;&amp;lt; h.first &amp;lt;&amp;lt; "Hit / " &amp;lt;&amp;lt; h.second &amp;lt;&amp;lt; "Blow";
} 

&lt;font color="green"&gt;// 出題者&lt;/font&gt;
&lt;font color="blue"&gt;class&lt;/font&gt; contributor {
  &lt;font color="blue"&gt;friend&lt;/font&gt; &lt;font color="blue"&gt;class&lt;/font&gt; referee;
&lt;font color="blue"&gt;public&lt;/font&gt;:
  contributor(number a) : answer(a) {}
&lt;font color="blue"&gt;private&lt;/font&gt;:
  number answer;
};

&lt;font color="green"&gt;// 審判員&lt;/font&gt;
&lt;font color="blue"&gt;class&lt;/font&gt; referee {
&lt;font color="blue"&gt;public&lt;/font&gt;:
  &lt;font color="green"&gt;// 重複のないことを確認する&lt;/font&gt;
  &lt;font color="blue"&gt;static&lt;/font&gt; &lt;font color="blue"&gt;bool&lt;/font&gt; isnot_duplicated(number n) {
    sort(begin(n),end(n));
    &lt;font color="blue"&gt;return&lt;/font&gt; unique(begin(n),end(n)) == end(n);
  }
  &lt;font color="green"&gt;// hit/blow数を勘定する&lt;/font&gt;
  &lt;font color="blue"&gt;static&lt;/font&gt; hb judge(&lt;font color="blue"&gt;const&lt;/font&gt; number&amp;amp; actual, &lt;font color="blue"&gt;const&lt;/font&gt; number&amp;amp; guess) {
    &lt;font color="blue"&gt;int&lt;/font&gt; hit = 0;
    &lt;font color="blue"&gt;int&lt;/font&gt; blow = 0;
    &lt;font color="blue"&gt;for&lt;/font&gt; ( &lt;font color="blue"&gt;int&lt;/font&gt; i = 0; i &amp;lt; N ; ++i ) {
      &lt;font color="blue"&gt;for&lt;/font&gt; ( &lt;font color="blue"&gt;int&lt;/font&gt; j = 0; j &amp;lt; N; ++j ) {
        &lt;font color="blue"&gt;if&lt;/font&gt; ( actual[i] == guess[j] ) {
          &lt;font color="blue"&gt;if&lt;/font&gt; ( i == j ) ++hit; &lt;font color="blue"&gt;else&lt;/font&gt; ++blow;
        }
      }
    }
    &lt;font color="blue"&gt;return&lt;/font&gt; hb(hit,blow);
  }
  &lt;font color="blue"&gt;static&lt;/font&gt; hb judge(contributor&amp;amp; con, &lt;font color="blue"&gt;const&lt;/font&gt; number&amp;amp; guess) {
    &lt;font color="blue"&gt;return&lt;/font&gt; judge(con.answer, guess);
  }
};

&lt;font color="green"&gt;// 解答者&lt;/font&gt;
&lt;font color="blue"&gt;class&lt;/font&gt; solver {
&lt;font color="blue"&gt;private&lt;/font&gt;:
  &lt;font color="blue"&gt;typedef&lt;/font&gt; pair&amp;lt;number,hb&amp;gt; hint;
&lt;font color="blue"&gt;public&lt;/font&gt;:
  solver() {
    init_candidates();
  }
  &lt;font color="green"&gt;// hintを追加する&lt;/font&gt;
  &lt;font color="blue"&gt;void&lt;/font&gt; add_hint(number n, hb h) {
    hints.push_back(hint(n,h));
  }
  &lt;font color="green"&gt;// 候補の中から答案をひとつ返す&lt;/font&gt;
  number submit() {
    think();
    random_shuffle(begin(candidates),end(candidates));
    &lt;font color="blue"&gt;return&lt;/font&gt; candidates.back();
  }
  &lt;font color="green"&gt;// 候補の数を返す&lt;/font&gt;
  &lt;font color="blue"&gt;int&lt;/font&gt; n_candidates() &lt;font color="blue"&gt;const&lt;/font&gt; {
    &lt;font color="blue"&gt;return&lt;/font&gt; candidates.size();
  }
&lt;font color="blue"&gt;private&lt;/font&gt;:
  &lt;font color="green"&gt;// 1～9から重複なくN個選び、候補を列挙する。&lt;/font&gt;
  &lt;font color="blue"&gt;void&lt;/font&gt; init_candidates() {
    array&amp;lt;&lt;font color="blue"&gt;bool&lt;/font&gt;,9&amp;gt; bits;
    fill(begin(bits),end(bits),&lt;font color="blue"&gt;false&lt;/font&gt;);
    fill_n(begin(bits), N, &lt;font color="blue"&gt;true&lt;/font&gt;);
    &lt;font color="blue"&gt;do&lt;/font&gt; {
      &lt;font color="blue"&gt;int&lt;/font&gt; c = 0;
      number tmp;
      &lt;font color="blue"&gt;for&lt;/font&gt; ( &lt;font color="blue"&gt;int&lt;/font&gt; i = 0; i &amp;lt; 9; ++i ) {
        &lt;font color="blue"&gt;if&lt;/font&gt; ( bits[i] ) tmp[c++] = i+1;
      }
      &lt;font color="blue"&gt;do&lt;/font&gt; {
        candidates.push_back(tmp);
      } &lt;font color="blue"&gt;while&lt;/font&gt; ( next_permutation(begin(tmp),end(tmp)) );
    } &lt;font color="blue"&gt;while&lt;/font&gt; ( prev_permutation(begin(bits),end(bits)) );
  }
  &lt;font color="blue"&gt;void&lt;/font&gt; think() {
    &lt;font color="green"&gt;// 候補の中から、これまでに得られたhintと矛盾があるものを除外する&lt;/font&gt;
    candidates.erase(
      remove_if(begin(candidates),end(candidates),
                [&amp;amp;](number n) { 
                  &lt;font color="blue"&gt;return&lt;/font&gt; any_of(begin(hints),end(hints),
                                [&amp;amp;](hint h) { 
                                  &lt;font color="blue"&gt;return&lt;/font&gt; referee::judge(n,h.first) != h.second;
                                });
                }), 
                end(candidates));
  }
  vector&amp;lt;number&amp;gt; candidates; &lt;font color="green"&gt;// 候補&lt;/font&gt;
  vector&amp;lt;hint&amp;gt; hints; &lt;font color="green"&gt;// もらったヒント&lt;/font&gt;
};

&lt;font color="blue"&gt;int&lt;/font&gt; main() {
  number answer;
  &lt;font color="blue"&gt;while&lt;/font&gt; ( &lt;font color="blue"&gt;true&lt;/font&gt; ) {
    cout &amp;lt;&amp;lt; "各桁が1～9である" &amp;lt;&amp;lt; N &amp;lt;&amp;lt; "桁の数を入力してほしい。各桁で数が重複するのは避けてくれ" &amp;lt;&amp;lt; endl;
    string str; cin &amp;gt;&amp;gt; str;
    &lt;font color="blue"&gt;const&lt;/font&gt; string digits = "123456789";
    &lt;font color="blue"&gt;if&lt;/font&gt; ( str.size() == N &amp;amp;&amp;amp; 
         all_of(begin(str),end(str),[&amp;amp;](&lt;font color="blue"&gt;char&lt;/font&gt; c) { &lt;font color="blue"&gt;return&lt;/font&gt; digits.find(c) != string::npos;}) ) {
      transform(begin(str), end(str), begin(answer), [](&lt;font color="blue"&gt;char&lt;/font&gt; c) { &lt;font color="blue"&gt;return&lt;/font&gt; c - '0';});
      &lt;font color="blue"&gt;if&lt;/font&gt; ( referee::isnot_duplicated(answer) ) &lt;font color="blue"&gt;break&lt;/font&gt;;
    }
  }    
  cout &amp;lt;&amp;lt; "君が選んだのは " &amp;lt;&amp;lt; answer &amp;lt;&amp;lt; " だね。";
  contributor con(answer);
  solver      sol;
  cout &amp;lt;&amp;lt; "では僕がその数を推理しよう。" &amp;lt;&amp;lt; endl;

  &lt;font color="blue"&gt;int&lt;/font&gt; trial = 0;
  &lt;font color="blue"&gt;while&lt;/font&gt; ( &lt;font color="blue"&gt;true&lt;/font&gt; ) {
    &lt;font color="green"&gt;// 候補の中からひとつ選ぶ&lt;/font&gt;
    cout &amp;lt;&amp;lt; ++trial &amp;lt;&amp;lt; "回目："
         &amp;lt;&amp;lt; " 正解となる数の候補は " &amp;lt;&amp;lt; sol.n_candidates() &amp;lt;&amp;lt; " あるが... ";
    number candidate = sol.submit();
    cout &amp;lt;&amp;lt; candidate &amp;lt;&amp;lt; " ではないかな?" &amp;lt;&amp;lt; endl;

    &lt;font color="green"&gt;// 結果を判定。 正解ならばloopを抜ける&lt;/font&gt;
    hb result = referee::judge(con, candidate);
    cout &amp;lt;&amp;lt; result &amp;lt;&amp;lt; endl;
    &lt;font color="blue"&gt;if&lt;/font&gt; ( result.first == N ) &lt;font color="blue"&gt;break&lt;/font&gt;;

    &lt;font color="green"&gt;// 判定結果をhintsに追加する&lt;/font&gt;
    sol.add_hint(candidate,result);    
  }
}
&lt;/pre&gt;&lt;/div&gt;&lt;img src ="http://blogs.wankuma.com/episteme/aggbug/310396.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>Visual Studio 2012 Nov.CTP : Explicit conversion operators</title><link>http://blogs.wankuma.com/episteme/archive/2012/12/24/310290.aspx</link><pubDate>Mon, 24 Dec 2012 11:22:00 GMT</pubDate><guid>http://blogs.wankuma.com/episteme/archive/2012/12/24/310290.aspx</guid><wfw:comment>http://blogs.wankuma.com/episteme/comments/310290.aspx</wfw:comment><comments>http://blogs.wankuma.com/episteme/archive/2012/12/24/310290.aspx#Feedback</comments><slash:comments>81</slash:comments><wfw:commentRss>http://blogs.wankuma.com/episteme/comments/commentRss/310290.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/episteme/services/trackbacks/310290.aspx</trackback:ping><description>&lt;p&gt;こんなの↓書いたとするわな:&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;#include &amp;lt;iostream&amp;gt;&lt;iostream&gt;&lt;br&gt;using namespace std;&lt;/iostream&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;class negative {&lt;br&gt;public:&lt;br&gt;&amp;nbsp; negative(int v) : value_(v) {}&lt;br&gt;&amp;nbsp; &lt;strong&gt;operator bool() const&lt;/strong&gt; { return value_ &amp;lt; 0; } // [*]&lt;br&gt;private:&lt;br&gt;&amp;nbsp; int value_;&lt;br&gt;};&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;int main() {&lt;br&gt;&amp;nbsp; negative neg(-3);&lt;br&gt;&amp;nbsp; cout &amp;lt;&amp;lt; boolalpha &amp;lt;&amp;lt; neg + 123 &amp;lt;&amp;lt; endl;　&lt;font color="#008000"&gt;// おっと、errorにはならんのか。&lt;/font&gt;&lt;br&gt;}&lt;br&gt;&lt;/font&gt;&lt;br&gt;問題は neg + 123 のとこ。 neg がoperator bool() で変換され、さらに0/1に変換されてまう。&lt;/p&gt;&lt;p&gt;C++11ではoperator ほげほげ() に　'&lt;font face="Courier New"&gt;explicit&lt;/font&gt;' を付けることで&lt;strong&gt;暗黙の型変換を抑止&lt;/strong&gt;できるようになりました。&lt;br&gt;[*] のトコを explicit operator bool() const { return value_ &amp;lt; 0; } とすることで、neg + 123 の箇所で:&lt;/p&gt;&lt;p&gt;error C2678: binary '+' : no operator found which takes a left-hand operand of type 'negative' (or there is no acceptable conversion)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; could be 'built-in C++ operator+(bool, int)'&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while trying to match the argument list '(negative, int)'&lt;/p&gt;&lt;p&gt;なんてなエラーを吐いてくれるです。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/episteme/aggbug/310290.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>