<?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>C/C++</title><link>http://blogs.wankuma.com/andochin/category/1968.aspx</link><description>C/C++</description><managingEditor>あんどちん</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>あんどちん</dc:creator><title>仮想関数を持たずに仮想関数テーブルを持つ</title><link>http://blogs.wankuma.com/andochin/archive/2013/08/27/328084.aspx</link><pubDate>Tue, 27 Aug 2013 00:22:00 GMT</pubDate><guid>http://blogs.wankuma.com/andochin/archive/2013/08/27/328084.aspx</guid><wfw:comment>http://blogs.wankuma.com/andochin/comments/328084.aspx</wfw:comment><comments>http://blogs.wankuma.com/andochin/archive/2013/08/27/328084.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/andochin/comments/commentRss/328084.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/andochin/services/trackbacks/328084.aspx</trackback:ping><description>&lt;p&gt;C++11では、=deleteで関数の定義を削除できます。この機能を利用すると、以下のように仮想関数を持たないクラスに仮想関数テーブルを作成できます。&lt;/p&gt; &lt;p&gt;&lt;font color="#004000" size="3"&gt;&lt;strong&gt;struct S {&lt;br&gt;&amp;nbsp; virtual void f() = delete;&lt;br&gt;};&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;仮想関数テーブルを持てるということは、RTTIが使用できるので、何かに使えそうです。&lt;/p&gt; &lt;p&gt;ただ、使い道が思い浮かばないっていう…&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/andochin/aggbug/328084.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>あんどちん</dc:creator><title>C++ポケットリファレンス発売されました</title><link>http://blogs.wankuma.com/andochin/archive/2013/05/15/327888.aspx</link><pubDate>Wed, 15 May 2013 00:30:00 GMT</pubDate><guid>http://blogs.wankuma.com/andochin/archive/2013/05/15/327888.aspx</guid><wfw:comment>http://blogs.wankuma.com/andochin/comments/327888.aspx</wfw:comment><comments>http://blogs.wankuma.com/andochin/archive/2013/05/15/327888.aspx#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://blogs.wankuma.com/andochin/comments/commentRss/327888.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/andochin/services/trackbacks/327888.aspx</trackback:ping><description>&lt;p&gt;先行発売書店では既に発売開始したみたいです。&lt;/p&gt; &lt;p&gt;先行発売店舗は以下の通りです。&lt;/p&gt; &lt;ul&gt; &lt;li&gt;紀伊國屋書店新宿本店&lt;/li&gt; &lt;li&gt;紀伊國屋書店新宿南店&lt;/li&gt; &lt;li&gt;書泉ブックタワー&lt;/li&gt; &lt;li&gt;三省堂神田神保町本店&lt;/li&gt; &lt;li&gt;有隣堂ヨドバシAKIBA店&lt;/li&gt; &lt;li&gt;ジュンク堂書店池袋本店&lt;/li&gt; &lt;li&gt;丸善丸の内本店&lt;/li&gt; &lt;li&gt;八重洲ブックセンター本店&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;a href="http://andochin.wankuma.com/images/C_5B5/DSC00068.jpg"&gt;&lt;img title="DSC00068" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="DSC00068" src="http://andochin.wankuma.com/images/C_5B5/DSC00068_thumb.jpg" width="244" height="184"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;先行発売店舗以外では５月１８日からの発売となります。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/andochin/aggbug/327888.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>あんどちん</dc:creator><title>C++ポケットリファレンス</title><link>http://blogs.wankuma.com/andochin/archive/2013/04/25/327861.aspx</link><pubDate>Thu, 25 Apr 2013 01:15:00 GMT</pubDate><guid>http://blogs.wankuma.com/andochin/archive/2013/04/25/327861.aspx</guid><wfw:comment>http://blogs.wankuma.com/andochin/comments/327861.aspx</wfw:comment><comments>http://blogs.wankuma.com/andochin/archive/2013/04/25/327861.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/andochin/comments/commentRss/327861.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/andochin/services/trackbacks/327861.aspx</trackback:ping><description>&lt;p&gt;ぼくも執筆に協力したC++ポケットリファレンスがようやく発売の運びとなりました。&lt;/p&gt; &lt;p&gt;&lt;a href="http://andochin.wankuma.com/images/C_516/pokeref_cover.png"&gt;&lt;img title="pokeref_cover" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="pokeref_cover" src="http://andochin.wankuma.com/images/C_516/pokeref_cover_thumb.png" width="161" height="244"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;中々カコイイ表紙です。&lt;/p&gt; &lt;p&gt;Amazonにもページできました。来月発売なのに結構いい順位になってたりして、びっくりしてます。&lt;/p&gt;&lt;iframe style="height: 240px; width: 120px" marginheight="0" src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=andochin-22&amp;amp;o=9&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=4774157155" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt; &lt;p&gt;あと、&lt;a href="http://gihyo.jp/book/2013/978-4-7741-5715-3"&gt;&lt;strong&gt;&lt;font color="#0000ff" size="2"&gt;技術評論社の書籍紹介ページ&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;を見ても、tweet数やfacebookの「いいね！」が結構な数になっていてびっくりです。&lt;/p&gt; &lt;p&gt;世の中のC++に対する反応っていうのは僕が思っている以上に凄いですね。&lt;/p&gt; &lt;p&gt;本の内容ですが、リファレンス本なので、「これやりたいんだけど」とか、「どう書くんだっけ？」といった場合に使う本で、所謂入門書とは違います。ただ、C++の入門書を読んだ人や、CやC#やJavaなどの言語を使ったことのある人がC++11でプログラムを書くことになった時には役に立つと思います。&lt;/p&gt; &lt;p&gt;# リファレンス本じゃなくて、C++11対応の入門書が欲しい人は…然るべき方に「書いて」って言いましょうｗ。&lt;/p&gt; &lt;p&gt;この本の最大の売りは、C++11対応でしょう。&lt;strong&gt;&lt;font color="#ff0000"&gt;日本人が日本語で書いたC++本でC++11をここまで盛り込んでいる本は今のところ無いと思います&lt;/font&gt;&lt;/strong&gt;。文法も標準ライブラリも一通り網羅していて、C++11対応。日本で出ているC++本に対する印象からすると、よくこれを出させてくれたなって思います。技術評論社さんに感謝です。&lt;/p&gt; &lt;p&gt;528ページというページ数で色々な反応がありますが、僕自身C言語ポケットリファレンスやJavaポケットリファレンス、Linuxコマンドポケットリファレンスを持っているポケリストですが、それらの本と大体同じくらいの厚さ。オーバーオールのポケットやダウンジャケットの大きめのポケットなら（たぶん）入るサイズです。鈍器と呼ぶのは1000ページ超えてからにしましょう。&lt;/p&gt; &lt;p&gt;それから、この本は電子書籍版も同時発売となります。電子書籍なら重さは気にならないですね！&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/andochin/aggbug/327861.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>あんどちん</dc:creator><title>VC11のrange-based forサポートとinitializer-list</title><link>http://blogs.wankuma.com/andochin/archive/2012/08/31/288697.aspx</link><pubDate>Fri, 31 Aug 2012 02:38:00 GMT</pubDate><guid>http://blogs.wankuma.com/andochin/archive/2012/08/31/288697.aspx</guid><wfw:comment>http://blogs.wankuma.com/andochin/comments/288697.aspx</wfw:comment><comments>http://blogs.wankuma.com/andochin/archive/2012/08/31/288697.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/andochin/comments/commentRss/288697.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/andochin/services/trackbacks/288697.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx"&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;ここ&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;に書かれているVC11のC++11サポート状況をみると、range-based for-loopがYesになっており、きちんとサポートされているように見えるのですが、「あれ？」と思ったんですね。&lt;/p&gt; &lt;p&gt;規格のrange-based for-loopのところをみるとrange-based for-loopには以下の形式もあります&lt;/p&gt; &lt;p&gt;for ( &lt;em&gt;for-range-declaration&lt;/em&gt; : &lt;em&gt;braced-init-list&lt;/em&gt; ) &lt;em&gt;statement&lt;/em&gt;&lt;/p&gt; &lt;p&gt;initializer-listをサポートしていないVCでこれが通るんでしょうか？しかし、この書式が受け付けられなければYesではなく、Partialと書いてありそうな気がします。&lt;/p&gt; &lt;p&gt;そこで、以下のコードを試してみたのですが、コンパイルエラーになりました。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#008040"&gt;for(auto v : { 0, 1, 2, 3 }) cout &amp;lt;&amp;lt; v &amp;lt;&amp;lt; endl;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;うぅん…予想できたこととはいえ、ちょっと残念&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/andochin/aggbug/288697.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>あんどちん</dc:creator><title>CとC++におけるUniversal Character Nameの違い</title><link>http://blogs.wankuma.com/andochin/archive/2012/08/08/284917.aspx</link><pubDate>Wed, 08 Aug 2012 00:58:00 GMT</pubDate><guid>http://blogs.wankuma.com/andochin/archive/2012/08/08/284917.aspx</guid><wfw:comment>http://blogs.wankuma.com/andochin/comments/284917.aspx</wfw:comment><comments>http://blogs.wankuma.com/andochin/archive/2012/08/08/284917.aspx#Feedback</comments><slash:comments>20</slash:comments><wfw:commentRss>http://blogs.wankuma.com/andochin/comments/commentRss/284917.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/andochin/services/trackbacks/284917.aspx</trackback:ping><description>&lt;p&gt;CとC++では、\uNNNNもしくは\UNNNNNNNNのフォーマットでUniversal Character Nameを扱えますが、使える文字に違いがあります。&lt;/p&gt; &lt;p&gt;C言語では、N1124の6.4.3章によると0024,0040,0060を除く00A0未満の値及びD800-DFFFはUniversal Character Nameで使用禁止となっています。&lt;/p&gt; &lt;p&gt;C++では、ISO14882:2011の2.3章によると0000-001Fと007F-009F、そして基本ソース文字セットとD800-DFFFはUniversal Character Nameで使用禁止となっています。&lt;/p&gt; &lt;p&gt;なんでこんな違いがあるんでしょうね？&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/andochin/aggbug/284917.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>あんどちん</dc:creator><title>gcc-4.7におけるinline namespaceとnamespaceの混在</title><link>http://blogs.wankuma.com/andochin/archive/2012/05/23/272804.aspx</link><pubDate>Wed, 23 May 2012 00:10:00 GMT</pubDate><guid>http://blogs.wankuma.com/andochin/archive/2012/05/23/272804.aspx</guid><wfw:comment>http://blogs.wankuma.com/andochin/comments/272804.aspx</wfw:comment><comments>http://blogs.wankuma.com/andochin/archive/2012/05/23/272804.aspx#Feedback</comments><slash:comments>33</slash:comments><wfw:commentRss>http://blogs.wankuma.com/andochin/comments/commentRss/272804.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/andochin/services/trackbacks/272804.aspx</trackback:ping><description>&lt;p&gt;C++11にはインラインネームスペースという機能があります。インラインネームスペース内は透過的にアクセスすることが可能です。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;inline namespace name {&lt;br&gt;&amp;nbsp; void foo();&lt;br&gt;}&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;この場合fooはname::foo();でもfoo();でも呼び出せます。&lt;/p&gt; &lt;p&gt;そんなinline namespace。gccでも実装されているのですが、同名のinline namespaceとnamespaceを作るとどちらもinline namespaceとして扱われてしまうというバグが存在しています。&lt;/p&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;namespace name {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void func1() {}&lt;br&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;inline namespace name {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void func2() {}&lt;br&gt;}&lt;br&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;上記のように同じ名前空間をinline namespace/namespace両方でで宣言すると、どちらに含まれる識別子も名前修飾なしで透過的にアクセスできてしまいます。&lt;/p&gt;&lt;p&gt;そもそも同名名前空間のinlineと非インラインの混在がダメなような気がしますが、それができて、その通り機能してくれたらライブラリ屋さん的には便利かも？と思います。&lt;/p&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/font&gt;&lt;img src ="http://blogs.wankuma.com/andochin/aggbug/272804.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>あんどちん</dc:creator><title>gcc-4.7におけるnon-satatic data member initializer とthis</title><link>http://blogs.wankuma.com/andochin/archive/2012/04/14/267387.aspx</link><pubDate>Sat, 14 Apr 2012 12:16:00 GMT</pubDate><guid>http://blogs.wankuma.com/andochin/archive/2012/04/14/267387.aspx</guid><wfw:comment>http://blogs.wankuma.com/andochin/comments/267387.aspx</wfw:comment><comments>http://blogs.wankuma.com/andochin/archive/2012/04/14/267387.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/andochin/comments/commentRss/267387.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/andochin/services/trackbacks/267387.aspx</trackback:ping><description>&lt;p&gt;C++11ではnon-static data member initializerが導入され、クラスの初期値設定をよりわかりやすく行うことが出来るようになっています。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#4bacc6"&gt;struct X {&lt;br&gt;&amp;nbsp; int a = 10; // Xの初期値は10&lt;br&gt;&amp;nbsp; X() : a(10) /* これと同じ */ {}&lt;br&gt;};&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;この初期化子ではthisを使用することもできます。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#4bacc6"&gt;struct X {&lt;br&gt;&amp;nbsp; size_t sz = sizeof(*this); // これは可能&lt;br&gt;&amp;nbsp; int arr[sizeof(*this)];&amp;nbsp; // でもこれは不可&lt;br&gt;};&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;さて、gcc-4.7では以下のコードのコンパイルが通ってしまいます。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#4bacc6"&gt;struct X {&lt;br&gt;&amp;nbsp; void f() {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct Y {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; size_t sz = sizeof(*this); // Yのサイズ&lt;/font&gt;&lt;/strong&gt;&lt;strong&gt;&lt;font color="#4bacc6"&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int arr[sizeof(*this)]; // エラーのはずだが…&lt;br&gt;&amp;nbsp; };&lt;/font&gt;&lt;/strong&gt;&lt;font color="#4bacc6"&gt;&lt;br&gt;&lt;strong&gt;};&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;この時Y::szにはYのサイズが、Y::arrの要素数にはXのサイズが適用されています。バグでしょうね。&lt;/p&gt; &lt;p&gt;なお、Clangではエラーを出力してくれます。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/andochin/aggbug/267387.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>あんどちん</dc:creator><title>tupleのネスト</title><link>http://blogs.wankuma.com/andochin/archive/2012/04/04/264665.aspx</link><pubDate>Wed, 04 Apr 2012 01:31:00 GMT</pubDate><guid>http://blogs.wankuma.com/andochin/archive/2012/04/04/264665.aspx</guid><wfw:comment>http://blogs.wankuma.com/andochin/comments/264665.aspx</wfw:comment><comments>http://blogs.wankuma.com/andochin/archive/2012/04/04/264665.aspx#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://blogs.wankuma.com/andochin/comments/commentRss/264665.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/andochin/services/trackbacks/264665.aspx</trackback:ping><description>&lt;p&gt;利用用途があるかどうかはともかく…&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#4f81bd"&gt;tuple&amp;lt;char, tuple&amp;lt;short,&amp;nbsp; long&amp;gt;&amp;gt; val;&lt;br&gt;auto elem = get&amp;lt;1&amp;gt;(val);&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;このコードはgccでもVCでも問題なくコンパイルできます。&lt;/p&gt; &lt;p&gt;但し、&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#4f81bd"&gt;struct A{};&lt;br&gt;struct B{};&lt;br&gt;struct C{};&lt;br&gt;//…&lt;br&gt;tuple&amp;lt;A,tuple&amp;lt;B,C&amp;gt;&amp;gt;val;&lt;br&gt;auto elem = get&amp;lt;1&amp;gt;(val);&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;このコードはVCだと通りますが、gccだとエラーになります。&lt;/p&gt; &lt;p&gt;コードが悪いのか、gccが悪いのか、はたまたVCが悪いのか。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/andochin/aggbug/264665.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>あんどちん</dc:creator><title>ラムダ式の関数ポインタを返すラムダ式</title><link>http://blogs.wankuma.com/andochin/archive/2012/03/08/256394.aspx</link><pubDate>Thu, 08 Mar 2012 02:40:00 GMT</pubDate><guid>http://blogs.wankuma.com/andochin/archive/2012/03/08/256394.aspx</guid><wfw:comment>http://blogs.wankuma.com/andochin/comments/256394.aspx</wfw:comment><comments>http://blogs.wankuma.com/andochin/archive/2012/03/08/256394.aspx#Feedback</comments><slash:comments>680</slash:comments><wfw:commentRss>http://blogs.wankuma.com/andochin/comments/commentRss/256394.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/andochin/services/trackbacks/256394.aspx</trackback:ping><description>&lt;h4&gt;&lt;a href="http://blogs.wankuma.com/episteme/archive/2012/02/29/253885.aspx"&gt;&lt;font color="#0000ff"&gt;stateless lambda&lt;/font&gt;&lt;/a&gt;&lt;/h4&gt; &lt;p&gt;&lt;font size="2"&gt;を見て、&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="2"&gt;「へぇ、ラムダ式を関数ポインタに入れられるんだ」&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="2"&gt;と感心していたんですが、&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="2"&gt;「ラムダ式の関数ポインタを返すラムダ式って書けるのかな？」&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="2"&gt;という疑問が。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font style="background-color: #9bbb59" size="2"&gt;&lt;/font&gt;&lt;font style="" color="#4f81bd" size="2"&gt;#include &amp;lt;iostream&amp;gt;&lt;br&gt;#include &amp;lt;vector&amp;gt;&lt;br&gt;&lt;br&gt;int main()&lt;br&gt;{&lt;br&gt;&amp;nbsp; using namespace std;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font style="" color="#4f81bd" size="2"&gt;&amp;nbsp; void(*(*f)())() = []()-&amp;gt;void (*)() { return []{cout &amp;lt;&amp;lt; "hello\n";}; };&lt;br&gt;&amp;nbsp; void(*f1)() = f();&lt;br&gt;&amp;nbsp; f1();&lt;br&gt;&amp;nbsp; []()-&amp;gt;void (*)() { return []{cout &amp;lt;&amp;lt; "hello\n";};}()();&lt;br&gt;&amp;nbsp; &lt;br&gt;&amp;nbsp; vector&amp;lt;void(*)()&amp;gt; fv = {{[]{cout&amp;lt;&amp;lt;"1\n";}}, {[]{cout&amp;lt;&amp;lt;"2\n";}} };&lt;br&gt;&amp;nbsp; for(void(*a)() : fv) a();&lt;br&gt;}&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font style="background-color: #9bbb59"&gt;&lt;/font&gt;&lt;font style="" size="2"&gt;これの実行結果が&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#ff0000" size="2"&gt;&lt;strong&gt;hello&lt;br&gt;hello&lt;br&gt;1&lt;br&gt;2&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="2"&gt;fにラムダ式の関数ポインタを返すラムダ式の関数ポインタを入れ、その実行結果をf1に。そしてf1を呼べば”hello”と表示されます。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="2"&gt;その下の行は同じラムダ式を直接実行。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="2"&gt;そして&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="2"&gt;「vectorにだって入れられるよね？」&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="2"&gt;と疑問に思ったから試してみたのがその下。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font size="2"&gt;このプログラムはgcc-4.7.0 RC (2012/3/2版)で試しました。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;font style="background-color: #9bbb59" size="2"&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;/font&gt;&lt;img src ="http://blogs.wankuma.com/andochin/aggbug/256394.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>あんどちん</dc:creator><title>FizzBuzzと貧乏性</title><link>http://blogs.wankuma.com/andochin/archive/2010/10/19/194021.aspx</link><pubDate>Tue, 19 Oct 2010 23:44:00 GMT</pubDate><guid>http://blogs.wankuma.com/andochin/archive/2010/10/19/194021.aspx</guid><wfw:comment>http://blogs.wankuma.com/andochin/comments/194021.aspx</wfw:comment><comments>http://blogs.wankuma.com/andochin/archive/2010/10/19/194021.aspx#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://blogs.wankuma.com/andochin/comments/commentRss/194021.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/andochin/services/trackbacks/194021.aspx</trackback:ping><description>&lt;p&gt;良く見るプログラムの課題、FizzBuzz。問題の内容は以下の通り。&lt;/p&gt; &lt;ul&gt; &lt;li&gt;３で割り切れる数字の場合Fizzと言う  &lt;li&gt;５で割り切れる数字の場合Buzzと言う  &lt;li&gt;３でも５でも割り切れる数字の場合Fizz Buzzと言う  &lt;li&gt;上記以外（３でも５でも割り切れない）であれば数値を出力&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;さて、このプログラムを素直に書いてみると&lt;/p&gt; &lt;p&gt;&lt;font color="#008000"&gt;&lt;strong&gt;&lt;font size="1"&gt;string fizz_buzzer(int value)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string result;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(value % 3 == 0) result = "Fizz";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(value % 5 == 0) result = "Buzz";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(value % 3 == 0 &amp;amp;&amp;amp; value % 5 == 0) result = "FizzBuzz";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(value % 3 != 0 &amp;amp;&amp;amp; value % 5 != 0) result = lexical_cast&amp;lt;string&amp;gt;(value);&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return result;&lt;br&gt;}&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;こんな感じでしょうか。&lt;br&gt;「でもちょっと無駄があるなぁ…」&lt;br&gt;こう考えてしまうのが性。ぱっと見思い浮かぶのが&lt;br&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;5で割り切れる時Buzzを代入するのではなく連結すれば1行減らせる&lt;br&gt;&lt;/font&gt;&lt;/strong&gt;です。するとプログラムはこうなります。&lt;/p&gt; &lt;p&gt;&lt;font color="#008000"&gt;&lt;strong&gt;&lt;font size="1"&gt;string fizz_buzzer(int value)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string result;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(value % 3 == 0) result = "Fizz";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(value % 5 == 0) result += "Buzz";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(value % 3 != 0 &amp;amp;&amp;amp; value % 5 != 0) result = lexical_cast&amp;lt;string&amp;gt;(value);&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return result;&lt;br&gt;}&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;しかし、一度判定している３もしくは５で割った余りを再度計算するのが面白くないです。&lt;br&gt;「そうだ、フラグを追加しよう」&lt;br&gt;するとプログラムはこうなります。&lt;/p&gt; &lt;p&gt;&lt;font color="#008000"&gt;&lt;strong&gt;&lt;font size="1"&gt;string fizz_buzzer(int value)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string result;&lt;br&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#008000"&gt;&lt;strong&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bool fizz_or_buzz = false;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(value % 3 == 0) { result = "Fizz"; fizz_or_buzz = true; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(value % 5 == 0) { result += "Buzz"; fizz_or_buzz = true; };&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(!fizz_or_buzz) result = lexical_cast&amp;lt;string&amp;gt;(value);&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return result;&lt;br&gt;}&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;冗長な判定が無くなりいい感じになりました。しかし、フラグ用の変数を追加したのが面白くない。&lt;br&gt;そこで次の点に着目します。&lt;br&gt;「FizzでもBuzzでもなければresultの長さは0で数値代入になるじゃないか」&lt;br&gt;するとプログラムはこうなります。&lt;/p&gt; &lt;p&gt;&lt;font color="#008000"&gt;&lt;strong&gt;&lt;font size="1"&gt;string fizz_buzzer(int value)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string result;&lt;br&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;font color="#008000"&gt;&lt;strong&gt;&lt;font size="1"&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(value % 3 == 0) result = "Fizz";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(value % 5 == 0) result += "Buzz";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(result.size() == 0) result = lexical_cast&amp;lt;string&amp;gt;(value);&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return result;&lt;br&gt;}&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;「短くなって良かった。最初のプログラムと違いFizz/Buzzの条件が変わっても修正個所は１か所で済むし。」&lt;/p&gt; &lt;p&gt;そう思っていたんです。しかし、ある人の言葉でこれにも問題があることに気付きました。&lt;/p&gt; &lt;p&gt;「このプログラムは命題通りのプログラムになっているか？」&lt;/p&gt; &lt;p&gt;与えられた値に対する出力は要求通りです。しかし、このプログラムを見て最初の要求がわかるか？と言われれば確かにわかりにくいです。&lt;/p&gt; &lt;p&gt;FizzBuzzのように単純なプログラムであれば問題は無いですが、仕様をプログラマが脳内で最適化してコードに落とすと結果は合っていてもプログラムを見た時にその要求を満たしているかすぐわからないという問題が起きうるんですね。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/andochin/aggbug/194021.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>