<?xml version="1.0" encoding="UTF-8" ?>
<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns="http://purl.org/rss/1.0/"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">

  <channel rdf:about="https://dtyazsk.blog.shinobi.jp/RSS/100/">
    <title>どっかのゆとりのチラシの裏</title>
    <link>https://dtyazsk.blog.shinobi.jp/</link>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="https://dtyazsk.blog.shinobi.jp/RSS/" />
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" />
    <description>plasma_effectのメモ帳的ブログのようなsomething</description>
    <dc:language>ja</dc:language>
    <dc:date>2015-08-15T00:03:09+09:00</dc:date>
    <items>
    <rdf:Seq>
      <rdf:li rdf:resource="https://dtyazsk.blog.shinobi.jp/c--/vc--%20in%20vs2015%E3%81%AE%E6%A9%9F%E8%83%BD%20part02%20%E3%83%A6" />
      <rdf:li rdf:resource="https://dtyazsk.blog.shinobi.jp/c--/vc--%20in%20vs2015%E3%81%AE%E6%A9%9F%E8%83%BD%20part01%20c" />
      <rdf:li rdf:resource="https://dtyazsk.blog.shinobi.jp/c--/c--2z%E3%81%A7%E3%81%AF%E5%8B%95%E7%9A%84%E9%96%A2%E6%95%B0%E7%94%9F%E6%88%90%E3%81%8C%E8%BF%BD%E5%8A%A0%E3%81%95%E3%82%8C%E3%82%8B" />
      <rdf:li rdf:resource="https://dtyazsk.blog.shinobi.jp/c--/gcc%E3%81%A8vc--%E3%81%A7%E3%83%97%E3%83%AA%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5%E3%81%AE%E6%8C%99%E5%8B%95%E3%81%8C%E9%81%95%E3%81%86%E5%95%8F%E9%A1%8C" />
      <rdf:li rdf:resource="https://dtyazsk.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/%E7%9C%9F%E3%81%AE%E9%96%A2%E6%95%B0%E5%9E%8B%E8%A8%80%E8%AA%9E" />
      <rdf:li rdf:resource="https://dtyazsk.blog.shinobi.jp/c--/tmp" />
      <rdf:li rdf:resource="https://dtyazsk.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/%E6%B0%B8%E5%A4%9C%E6%8A%84%E3%83%AB%E3%83%8A%E3%83%8E%E3%83%BC%E3%83%9C%E3%83%A0%E9%81%94%E6%88%90%E8%A8%98%E5%BF%B5" />
      <rdf:li rdf:resource="https://dtyazsk.blog.shinobi.jp/c--/typedef-name%E3%81%A7%E3%81%AE%E3%82%B3%E3%83%B3%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%82%BF" />
      <rdf:li rdf:resource="https://dtyazsk.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/%E6%A5%BD%E3%81%97%E3%81%84%E3%82%AA%E3%83%95%E3%83%AC%E3%83%9D" />
      <rdf:li rdf:resource="https://dtyazsk.blog.shinobi.jp/kancolle/%E3%83%80%E3%83%A1%E3%82%B3%E3%83%B3%E4%BD%BF%E3%81%A3%E3%81%9F%E6%84%9F%E6%83%B3" />
    </rdf:Seq>
    </items>
  </channel>

  <item rdf:about="https://dtyazsk.blog.shinobi.jp/c--/vc--%20in%20vs2015%E3%81%AE%E6%A9%9F%E8%83%BD%20part02%20%E3%83%A6">
    <link>https://dtyazsk.blog.shinobi.jp/c--/vc--%20in%20vs2015%E3%81%AE%E6%A9%9F%E8%83%BD%20part02%20%E3%83%A6</link>
    <title>VC++ in VS2015の機能 part02 ユーザー定義リテラル</title>
    <description>「VS2015の記事を見てたはずだがいつの間にかconstexprの記事になっていた」という意見が出た。VC++固有の機能の記事なんて俺が書けるわけ無いだろ！！！！

2015年7月20日にVisual Studio 2015がリリースされた。当然VC++も新しくなったわけだがそのうち新しく追加され...</description>
    <content:encoded><![CDATA[「VS2015の記事を見てたはずだがいつの間にかconstexprの記事になっていた」という意見が出た。VC++固有の機能の記事なんて俺が書けるわけ無いだろ！！！！<br />
<br />
2015年7月20日にVisual Studio 2015がリリースされた。当然VC++も新しくなったわけだがそのうち新しく追加された機能を出来る限り毎日記事にしようと思う。<br />
本日はそのpart02、ユーザー定義リテラルだ。<br />
<br />
ある型の一時変数を作るのにわざわざ関数を使いたくはないという時があったりなかったりする。例えば複素数値型など。<br />
<pre class=" brush :cpp"><br />
struct complex{<br />
int re_,im_;<br />
constexpr complex(int re=0, int im=0):re_(re),im_(im){}<br />
complex(complex const&amp;)=default;<br />
complex(complex&amp;&amp;)=default;<br />
~complex()=default;<br />
};<br />
<br />
int main(){<br />
complex v = complex(0,2);//2iって書きたい<br />
}</pre><br />
<br />
<br />
100uでunsigned int型の100を表すようにユーザー定義のリテラルを使いたい。<br />
operator""でそのようなユーザー定義のリテラルを作ることができる。<br />
<pre class=" brush :cpp"><br />
struct complex{<br />
int re_,im_;<br />
constexpr complex(int re=0, int im=0):re_(re),im_(im){}<br />
complex(complex const&amp;)=default;<br />
complex(complex&amp;&amp;)=default;<br />
~complex()=default;<br />
};<br />
<br />
complex operator"" _i(unsigned long long int v){<br />
return complex(0, v);<br />
}<br />
<br />
int main(){<br />
complex v = 2_i;//complex(0, 2);<br />
}</pre><br />
<br />
<br />
ユーザー定義リテラルにはいくつか成約がある。まず引数の型にはunsigned long long intやlong doubleといった一部の型しか使えない。<br />
<pre class=" brush :cpp"><br />
int operator"" _hoge(unsigned long long int v){//OK<br />
return static_cast&lt;int&gt;(v);<br />
}<br />
int operator"" _piyo(int v){<br />
return static_cast&lt;int&gt;(v);<br />
}<br />
<br />
int main(){}</pre><br />
<br />
<br />
また_(アンダーバー)から始まらないリテラルは予約されてるので使うと色んな人に怒られる。コンパイラにも怒られる。<br />
<pre class=" brush :cpp"><br />
int operator"" hoge(unsigned long long int v){<br />
return static_cast&lt;int&gt;(v);<br />
}//コンパイルは通るが警告が出る<br />
<br />
int main(){}</pre><br />
<br />
<br />
あと規格的には""と_の間に空白文字(スペースなど)が必要&hellip;らしい。<span style="text-decoration: line-through;">別にMSVCでもgccでもclangでもスペース入れなくても通るんだから気にする必要とかないんじゃないのかこれ</span><br />
<br />
unsigned long long intの他に使える型を紹介する。まずはlong double<br />
<pre class=" brush :cpp"><br />
int operator"" _to_int(long double d){<br />
return static_cast&lt;int&gt;(d);<br />
}<br />
<br />
int main(){<br />
int v = 2.0_to_int;<br />
}</pre><br />
<br />
<br />
char const*<br />
<pre class=" brush :cpp"><br />
#include&lt;utility&gt;<br />
int operator"" _hoge(char const*, std::size_t s){<br />
return s;<br />
}<br />
<br />
int main(){<br />
int v = "test"_hoge;<br />
}</pre><br />
<br />
<br />
あとはwchar_tとかそこら辺である。<br />
<br />
ユーザー定義リテラルでは基本的にtemplateが使えない。ただしvariadic templateを使用できる唯一の例が存在する。<br />
<pre class=" brush :cpp"><br />
template&lt;char... Cs&gt;struct string_t{};<br />
template&lt;char... Cs&gt;string_t&lt;Cs...&gt; operator"" _hage(){<br />
return string_t&lt;Cs...&gt;{};<br />
}<br />
<br />
int main(){<br />
auto x = 12345_hage;//string_t&lt;'1', '2', '3', '4', '5'&gt;<br />
}</pre><br />
<br />
<br />
<br />
この場合引数は付けない。unsigned long long intのみに対応する。<br />
<br />
参考<br />
本の虫　ユーザー定義リテラルのすべて：<a href="http://cpplover.blogspot.jp/2012/02/blog-post_16.html" title="">http://cpplover.blogspot.jp/2012/02/blog-post_16.html</a><br />
C++11の文法と機能(C++11: Syntax and Feature)：<a href="http://ezoeryou.github.io/cpp-book/C++11-Syntax-and-Feature.xhtml#over.literal" title="">http://ezoeryou.github.io/cpp-book/C++11-Syntax-and-Feature.xhtml#over.literal</a><br />
<br />
余談<br />
記事書いてて公開するボタン押したら勝手にレイアウト変えられててマジギレだしブログ変えたい]]></content:encoded>
    <dc:subject>C++</dc:subject>
    <dc:date>2015-08-15T00:03:08+09:00</dc:date>
    <dc:creator>plasma_effect</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>plasma_effect</dc:rights>
  </item>
  <item rdf:about="https://dtyazsk.blog.shinobi.jp/c--/vc--%20in%20vs2015%E3%81%AE%E6%A9%9F%E8%83%BD%20part01%20c">
    <link>https://dtyazsk.blog.shinobi.jp/c--/vc--%20in%20vs2015%E3%81%AE%E6%A9%9F%E8%83%BD%20part01%20c</link>
    <title>VC++ in VS2015の機能 part01 constexpr</title>
    <description>久しぶりにブログ開いたら広告出てて泣いた。というわけで記事を書くことにする。

2015年7月20日にVisual Studio 2015がリリースされた。当然VC++も新しくなったわけだがそのうち新しく追加された機能を出来る限り毎日記事にしようと思う。
本日はそのpart01、constexprだ...</description>
    <content:encoded><![CDATA[久しぶりにブログ開いたら広告出てて泣いた。というわけで記事を書くことにする。<br />
<br />
2015年7月20日にVisual Studio 2015がリリースされた。当然VC++も新しくなったわけだがそのうち新しく追加された機能を出来る限り毎日記事にしようと思う。<br />
本日はそのpart01、constexprだ。<br />
<br />
constexprはC++11で追加された機能で、現在のC++14では更にパワーアップしているのだが、Microsoftの脳みそが2011年から進んでないのでC++11版のconstexprを紹介する。<br />
<br />
コンパイル時において定数式はその場で計算される。定数式とは例えば以下の様なもの。<br />
<pre class=" brush :cpp"><br />
int main(){<br />
const int v = 1 + 2;//明らかに3<br />
const int u = 3 * 5;//明らかに15<br />
}</pre><br />
一方でコンパイル時に使える定数(以下コンパイル時定数)が存在する。定数式で初期化されているconst定数がそれ。上の例で言えばvもuもコンパイル時定数である。コンパイル時に使えるとは例えばtemplate引数に渡せる。<br />
<br />
<pre class=" brush :cpp"><br />
template&lt;int N&gt;struct test{<br />
static int get(){<br />
   return N;<br />
}<br />
};<br />
<br />
int main(){<br />
const int v = 1 + 2;<br />
const int u = test&lt;v&gt;::get();<br />
}</pre><br />
この例ではvはコンパイル時定数なのでtemplateクラスtestの引数に渡せる。一方でstaticメンバ関数getは定数式ではないのでuはコンパイル時定数でない定数である。この場合uはtemplate引数に渡せない。<br />
<br />
変数に対するconstexprは変数がコンパイル時定数であることを保証する指定子である。型はあくまでconstであり、constexprではない。<br />
<br />
<pre class=" brush :cpp"><br />
int hoge(){return 0;}<br />
<br />
int main(){<br />
constexpr int v = 0;//OK<br />
constexpr int u = hoge();//NG<br />
}</pre><br />
一方で関数に対するconstexprはその関数を定数式として扱えるようにする指定子である。constexpr関数の中身は実質的にreturn文一つでなければならない。<br />
<pre class=" brush :cpp"><br />
constexpr int hoge(){return 0;}<br />
constexpr int fact(int n){return n==0 ? 1 : n*fact(n-1);}<br />
<br />
int main(){<br />
constexpr int v = 0;//OK<br />
constexpr int u = hoge();//OK<br />
constexpr int w = fact(5);//OK<br />
}</pre><br />
return文一つといっても条件演算子が使えるので関数型言語に慣れている人なら親しみを持てるのではないだろうか。<br />
<br />
定数式とできるのは組み込み型がまず上げられるがユーザー定義でconstexpr定数、またはconstexpr関数に使えるクラスも作ることができる。定数式に使える型をリテラル型と言う。<br />
<br />
リテラル型には組み込み型やその配列がまず考えられるが、それらを組み合わせたユーザー定義型でリテラル型となる条件は以下のとおり。<br />
・デストラクタがトリビアル<br />
・次のどちらかを満たす「aggregateである」「コピーでもムーブでもないconstexprコンストラクタ、またはtemplateなコンストラクタを持つ」<br />
・staticでないメンバ変数が全てvolatileでもないリテラル型<br />
例えば以下の様なクラスがリテラル型となる。<br />
<pre class=" brush :cpp"><br />
struct pair{<br />
int x_,y_;<br />
constexpr pair(int x=0,int y=0):x_(x),y_(y){}<br />
pair(pair const&amp;)=default;<br />
pair(pair&amp;&amp;)=default;<br />
~pair()=default;<br />
};<br />
<br />
int main(){<br />
constexpr pair p(0,1);<br />
constexpr int u = p.x_;<br />
constexpr int v = p.y_;<br />
}</pre><br />
そういえば上のコードでわかるようにVS2015ではムーブコンストラクタもdefault宣言できるようになった。むしろ今までできなかったほうがおかしい。<br />
<br />
リテラル型やconstexprに関する活用法はここでは書かない。様々な場所で論じられているのでそちらを参考にして欲しい。<br />
<br />
参考ページ<br />
中３女子でもわかる constexpr：<a href="http://www.slideshare.net/GenyaMurakami/constexpr-10458089" title="">http://www.slideshare.net/GenyaMurakami/constexpr-10458089</a><br />
リテラル型クラスの条件、および「中３女子でもわかる constexpr」の訂正：<a href="http://boleros.hateblo.jp/entry/20130718/1374155184" title="">http://boleros.hateblo.jp/entry/20130718/1374155184</a><br />
C++11の文法と機能(C++11: Syntax and Feature)：<a href="http://ezoeryou.github.io/cpp-book/C++11-Syntax-and-Feature.xhtml#basic.types" title="">http://ezoeryou.github.io/cpp-book/C++11-Syntax-and-Feature.xhtml#basic.types</a><br />
<br />
余談<br />
実はVC++のconstexprでバグとかないかのチェックとかまだしてないしもしかしたら規格に反する動作をするかもしれない。]]></content:encoded>
    <dc:subject>C++</dc:subject>
    <dc:date>2015-08-14T00:55:04+09:00</dc:date>
    <dc:creator>plasma_effect</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>plasma_effect</dc:rights>
  </item>
  <item rdf:about="https://dtyazsk.blog.shinobi.jp/c--/c--2z%E3%81%A7%E3%81%AF%E5%8B%95%E7%9A%84%E9%96%A2%E6%95%B0%E7%94%9F%E6%88%90%E3%81%8C%E8%BF%BD%E5%8A%A0%E3%81%95%E3%82%8C%E3%82%8B">
    <link>https://dtyazsk.blog.shinobi.jp/c--/c--2z%E3%81%A7%E3%81%AF%E5%8B%95%E7%9A%84%E9%96%A2%E6%95%B0%E7%94%9F%E6%88%90%E3%81%8C%E8%BF%BD%E5%8A%A0%E3%81%95%E3%82%8C%E3%82%8B</link>
    <title>C++2zでは動的関数生成が追加される</title>
    <description>C++2zでは文字列から関数オブジェクトを生成されるtemplate関数compilingがfunctionalヘッダに追加される。std名前空間における宣言は以下のとおりだ。
template&amp;amp;lt;class FunT, std::size_t Alignment, class ForwardI...</description>
    <content:encoded><![CDATA[C++2zでは文字列から関数オブジェクトを生成されるtemplate関数compilingがfunctionalヘッダに追加される。std名前空間における宣言は以下のとおりだ。<br />
template&lt;class FunT, std::size_t Alignment, class ForwardIterator&gt;function&lt;FunT&gt;compiling(ForwardIterator first, ForwardIterator last);<br />
使い方は以下のとおりだ。<br />
<pre class=" brush :cpp"><br />
#include&lt;functional&gt;<br />
#include&lt;iostream&gt;<br />
#include&lt;string&gt;<br />
<br />
int main()<br />
{<br />
  std::string str="int add(int n,int m){return n + m;}";<br />
  auto func = std::compiling&lt;int(int, int), 8&gt;(str.begin(), str.end());<br />
  std::cout&lt;&lt; func(1, 2) &lt;&lt;std::endl;<br />
}</pre><br />
<br />
<br />
FunTは返り値のstd::functionの型を指定し、Alignmentはその関数で確保される最大のメモリ容量を指定する。<br />
ここで注意したいのはcompilingでは以下の機能しか使えない。すなわち<br />
・組み込み型の変数定義<br />
・組み込み型の演算子<br />
・if, for, while文<br />
・return文<br />
関数呼び出しやユーザー定義型が使えないことには要注意だ。<br />
また文字列が不合理な場合以下の様な例外が投げられる。複数の例外に当たる場合上のものが優先される。<br />
・文法的に意味を成さない(typedefや関数が使われている場合含む)&rarr;std::bad_function_parsing<br />
・返り値がFuncTで指定したものと合わない&rarr;std::bad_function_type<br />
・Alignmentで指定した以上のメモリを必要とする&rarr;std::memory_over_exception<br />
実行時に文字列を与えてそこから関数を生成することも可能となる。また将来的にはcompilingの文鳥言語版compiling_bunchoも導入される予定だ。]]></content:encoded>
    <dc:subject>C++</dc:subject>
    <dc:date>2015-04-01T12:33:27+09:00</dc:date>
    <dc:creator>plasma_effect</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>plasma_effect</dc:rights>
  </item>
  <item rdf:about="https://dtyazsk.blog.shinobi.jp/c--/gcc%E3%81%A8vc--%E3%81%A7%E3%83%97%E3%83%AA%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5%E3%81%AE%E6%8C%99%E5%8B%95%E3%81%8C%E9%81%95%E3%81%86%E5%95%8F%E9%A1%8C">
    <link>https://dtyazsk.blog.shinobi.jp/c--/gcc%E3%81%A8vc--%E3%81%A7%E3%83%97%E3%83%AA%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5%E3%81%AE%E6%8C%99%E5%8B%95%E3%81%8C%E9%81%95%E3%81%86%E5%95%8F%E9%A1%8C</link>
    <title>gccとVC++でプリプロセッサの挙動が違う問題</title>
    <description>世の中にはいろいろC++のコンパイラが存在するがとりわけgccとclangとMSVCが使われてると思う(あくまで著者の主観です、あとMSVCがC++コンパイラかどうかは議論がわかれます)。闇の言語であるC++の機能の中でも特に闇であるプリプロセッサだが、これがgccとMSVCで挙動が違う。以下のコー...</description>
    <content:encoded><![CDATA[世の中にはいろいろC++のコンパイラが存在するがとりわけgccとclangとMSVCが使われてると思う(あくまで著者の主観です、あとMSVCがC++コンパイラかどうかは議論がわかれます)。闇の言語であるC++の機能の中でも特に闇であるプリプロセッサだが、これがgccとMSVCで挙動が違う。以下のコードを見てほしい。<script src="https://gist.github.com/plasma-effect/f63b18fb9415c7038df0.js" type="text/javascript"></script>これをgccで展開すれば<a href="http://melpon.org/wandbox/permlink/lTR81V5aluQsVtoL" title="">こうなる</a><br />
&gt;<br />
&gt; xy<br />
一方でMSVCで展開すれば以下のようになる(/P /EPオプション使用)<br />
&gt; cat main.i<br />
&gt;<br />
&gt;<br />
&gt;<br />
&gt;<br />
&gt;<br />
&gt; xB (y)<br />
これはつまり展開の順番が違うということである。同一のプリプロセッサでもコンパイラによって挙動が違ってくる。これを知らずにコードを書くと死あるのみである。<br />
ていうか普通に死にそうなのでやめてほしい。<br />
<br />
ちなみにだがこれはAの定義をA(a) B(a)に、最後の行をCAT(x,A(y))にするとgccとMSVCで挙動が<span style="color: #ff0000;">一致する<span style="color: #000000;">。</span></span>調査の必要性を感じる。<br />
<a href="https://twitter.com/share" class="twitter-share-button" data-url="http://dtyazsk.blog.shinobi.jp/c--/gcc%E3%81%A8vc--%E3%81%A7%E3%83%97%E3%83%AA%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5%E3%81%AE%E6%8C%99%E5%8B%95%E3%81%8C%E9%81%95%E3%81%86%E5%95%8F%E9%A1%8C" data-via="plasma_effector">Tweet</a><script type="text/javascript">!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>]]></content:encoded>
    <dc:subject>C++</dc:subject>
    <dc:date>2015-02-12T10:59:15+09:00</dc:date>
    <dc:creator>plasma_effect</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>plasma_effect</dc:rights>
  </item>
  <item rdf:about="https://dtyazsk.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/%E7%9C%9F%E3%81%AE%E9%96%A2%E6%95%B0%E5%9E%8B%E8%A8%80%E8%AA%9E">
    <link>https://dtyazsk.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/%E7%9C%9F%E3%81%AE%E9%96%A2%E6%95%B0%E5%9E%8B%E8%A8%80%E8%AA%9E</link>
    <title>真の関数型言語</title>
    <description>それはお前の心の中にある！</description>
    <content:encoded><![CDATA[それはお前の心の中にある！]]></content:encoded>
    <dc:subject>未選択</dc:subject>
    <dc:date>2015-01-06T13:46:17+09:00</dc:date>
    <dc:creator>plasma_effect</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>plasma_effect</dc:rights>
  </item>
  <item rdf:about="https://dtyazsk.blog.shinobi.jp/c--/tmp">
    <link>https://dtyazsk.blog.shinobi.jp/c--/tmp</link>
    <title>TMP</title>
    <description>
C++アドベントカレンダーかー様子見してこっそり入ることも考えないとな&amp;amp;rarr;(数日後)&amp;amp;rarr;気づいたら全部埋まってた&amp;amp;hellip;(実話)
&amp;amp;mdash; plasma_effect (@plasma_effector) 2014, 12月 25知り合いがTMPについて解説してたので...</description>
    <content:encoded><![CDATA[<blockquote class="twitter-tweet" lang="ja"><br />
<p>C++アドベントカレンダーかー様子見してこっそり入ることも考えないとな&rarr;(数日後)&rarr;気づいたら全部埋まってた&hellip;(実話)</p><br />
&mdash; plasma_effect (@plasma_effector) <a href="https://twitter.com/plasma_effector/status/548034994136809472">2014, 12月 25</a></blockquote><script async="" src="//platform.twitter.com/widgets.js" charset="utf-8" type="text/javascript"></script>知り合いがTMPについて解説してたので我もTMPのテクニックの解説をするなり。<br />
とりあえずサンプルコードはgistに置いといた。<a href="https://gist.github.com/plasma-effect/839988dd1c9febbf6964" title="">ここ</a><br />
<br />
Template Meta Programming(略してTMP)とはC++の機能のtemplateを利用してほげほげするほげである。Wikipediaに「コンパイラがテンプレートを使って一時的ソースコードを生成し、それを他のソースコードと結合してコンパイルする方式である。」と書いてあるがわけがわからなかったら無視していい。templateでほげほげすることは確かである。<br />
<br />
通常TMPといえば「値に関する操作」「型に関する操作」の2種類あるが値に関する操作はconstexprでことがすむので型に関する操作の話をしていく。型に関する操作とはいかにという話だが例えばサンプルコードのexam1.cpp。<br />
これはtorio型が渡されたらその真ん中の型を取り出してtypedefするクラスである。要するにこんな感じで型で遊んでいくわけ。もちろんただ遊ぶのではなく有意義に遊ぶ。<br />
TMPには様々なテクニックがあるがよく知られているテクニックを2つ紹介する。<br />
<br />
1つ目はExpression Template。式をtemplateで表すテクニックである。<br />
例えばサンプルコードのexam2.cpp。これが要素数1万とかになってくると普通にoperator+を実装したのでは一時オブジェクトでその分メモリを消費したりするのでよろしくない。<br />
exam2.cppのようにoperator+の返り値をadd_vectorにすることでoperator[]が呼び出されるまで計算されないようにするのである。遅延評価をするという話だ。<br />
上では数値計算に使ったがそれ以外にも使い道はある。例えばexam3.cpp。C++にはコンパイル時ラムダ式がコア言語でサポートされてないのでそれをライブラリで対応したりできる。まぁこれでコンパイル時ラムダ式を完全にサポートするのは割とめんどくさそうなので暇な人は頑張ってください。<br />
上のコードでは演算子オーバーロードにADLを使っている。ここらへんの解説はめんどくさいので自分で検索して下さい。なんかADLは邪悪らしいとか地雷原がいっぱいとか聞いたことあるので地雷原回避する方法誰か教えてくださいお願いします。<br />
<br />
2つ目はType Erasure。型の情報を必要最低限まで抹消するテクニックである。例えばexam4.cpp。この他にも自作のVTableのほげほげをほげする方法はあるらしいがそれは参考リンクを参照。<br />
これはすなわち基底クラスのポインタに派生クラスのポインタを入れれることを利用する(ここでは派生クラスのunique_ptrは基底クラスのunique_ptrにキャストしている)<br />
ほとんど説明することもないと思う。読めば分かるという感じ。<br />
<br />
TMPはまだまだ奥が深い、他にも色々テクニックがあるので色々調べればいいと思う。<br />
<br />
<br />
間違ってること言ってたら誰か教えて欲しいですはい。<br />
あとgist無理矢理使おうとしてこんな感じになってしまった。<br />
<br />
参考ページ(Cryolite先生のはてなダイアリー)<br />
<a href="http://d.hatena.ne.jp/Cryolite/20040506" title="">http://d.hatena.ne.jp/Cryolite/20040506</a><br />
<a href="http://d.hatena.ne.jp/Cryolite/20051003" title="">http://d.hatena.ne.jp/Cryolite/20051003</a>]]></content:encoded>
    <dc:subject>C++</dc:subject>
    <dc:date>2014-12-27T17:34:12+09:00</dc:date>
    <dc:creator>plasma_effect</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>plasma_effect</dc:rights>
  </item>
  <item rdf:about="https://dtyazsk.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/%E6%B0%B8%E5%A4%9C%E6%8A%84%E3%83%AB%E3%83%8A%E3%83%8E%E3%83%BC%E3%83%9C%E3%83%A0%E9%81%94%E6%88%90%E8%A8%98%E5%BF%B5">
    <link>https://dtyazsk.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/%E6%B0%B8%E5%A4%9C%E6%8A%84%E3%83%AB%E3%83%8A%E3%83%8E%E3%83%BC%E3%83%9C%E3%83%A0%E9%81%94%E6%88%90%E8%A8%98%E5%BF%B5</link>
    <title>永夜抄ルナノーボム達成記念</title>
    <description>
震えてる、夢じゃないよな？ pic.twitter.com/qZZudZ5EKe
&amp;amp;mdash; plasma_effect (@plasma_effector) 2014, 12月 4
永夜抄LNBじゃあああああああ！！！！！！！！！！ http://t.co/WJ5MpSRJJu pic.tw...</description>
    <content:encoded><![CDATA[<blockquote class="twitter-tweet" lang="ja"><br />
<p>震えてる、夢じゃないよな？ <a href="http://t.co/qZZudZ5EKe">pic.twitter.com/qZZudZ5EKe</a></p><br />
&mdash; plasma_effect (@plasma_effector) <a href="https://twitter.com/plasma_effector/status/540505171625648131">2014, 12月 4</a></blockquote><script async="" src="//platform.twitter.com/widgets.js" charset="utf-8" type="text/javascript"></script><blockquote class="twitter-tweet" lang="ja"><br />
<p>永夜抄LNBじゃあああああああ！！！！！！！！！！ <a href="http://t.co/WJ5MpSRJJu">http://t.co/WJ5MpSRJJu</a> <a href="http://t.co/5X2UzWYG5E">pic.twitter.com/5X2UzWYG5E</a></p><br />
&mdash; plasma_effect (@plasma_effector) <a href="https://twitter.com/plasma_effector/status/540505317096714241">2014, 12月 4</a></blockquote><script async="" src="//platform.twitter.com/widgets.js" charset="utf-8" type="text/javascript"></script>はい。ついにやりました。<br />
機体は上のツイートの通り幽冥組(妖夢＆幽々子)、残0でした。<br />
機体選択はそもそも妖夢じゃないとみすちーが抜けれなかったとかいうアレががが。<br />
まぁ幽冥組が広範囲ショットと高威力ショットを兼ね備えてますし普通にむちゃくちゃ強いです。<blockquote class="twitter-tweet" lang="ja"><br />
<p>紅魔郷・風神録&rarr;残機が足りん 永夜抄&rarr;序盤運ゲー過ぎて萎える 星蓮船&rarr;クリアだけでつらいのにNBとか論外 神霊廟&rarr;LNNする勢いじゃないとLNBできないのがつらい 輝針城&rarr;個人的に嫌い 地霊殿か&hellip;</p><br />
&mdash; plasma_effect (@plasma_effector) <a href="https://twitter.com/plasma_effector/status/492253086484676610">2014, 7月 24</a></blockquote><script async="" src="//platform.twitter.com/widgets.js" charset="utf-8" type="text/javascript"></script>おそらくこれぐらいの時期に永夜抄LNBを始めてたと思います。<br />
4ヶ月以上やってましたが長かったです。<br />
オフ会で「よくそんな腕でLNB挑戦しようと思いますね」って言われたのは覚えてます。<br />
<a href="http://twilog.org/plasma_effector/date-141013" title="">10/13のアレ</a>とかもありました。<br />
元々稼ぎのための地力上げの一環としてやってたのでこれからも東方は続けていくつもりですが永夜抄はこれで一旦止めにしたいと思います。<blockquote class="twitter-tweet" lang="ja"><br />
<p>永夜抄やってて思ったけどラスペガン捨て＋(6)で18億出てたしもしかして頑張ったら永L幽冥組で30億出せる？</p><br />
&mdash; plasma_effect (@plasma_effector) <a href="https://twitter.com/plasma_effector/status/523033880719147010">2014, 10月 17</a></blockquote><script async="" src="//platform.twitter.com/widgets.js" charset="utf-8" type="text/javascript"></script>ああ、そんなツイートもあったな。気が向いたらやる。<br />
<br />
応援してくださった皆さん、おめでとうリプくださった皆さん、ありがとうございました！ついに俺はやったぞおおおおおお！！！！！！！<br />
<br />
どうでもいいけどプレビューしたらクッソ重くてワロタ]]></content:encoded>
    <dc:subject>未選択</dc:subject>
    <dc:date>2014-12-05T00:07:31+09:00</dc:date>
    <dc:creator>plasma_effect</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>plasma_effect</dc:rights>
  </item>
  <item rdf:about="https://dtyazsk.blog.shinobi.jp/c--/typedef-name%E3%81%A7%E3%81%AE%E3%82%B3%E3%83%B3%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%82%BF">
    <link>https://dtyazsk.blog.shinobi.jp/c--/typedef-name%E3%81%A7%E3%81%AE%E3%82%B3%E3%83%B3%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%82%BF</link>
    <title>typedef-nameでのコンストラクタ</title>
    <description>以下のコードについて考える。このコードは規格でill-formedらしい($12.1にThe class-name shall not be a typedef-name.とある)
とりあえずこれはclangやgccでは通らない。
一方でMSVC12.0(VS2013)では通った。相変わらずの規格無...</description>
    <content:encoded><![CDATA[以下のコードについて考える。<script src="https://gist.github.com/plasma-effect/504410accbbb64d626bf.js" type="text/javascript"></script>このコードは規格でill-formedらしい($12.1にThe class-name shall not be a typedef-name.とある)<br />
とりあえずこれはclangやgccでは通らない。<br />
一方でMSVC12.0(VS2013)では通った。相変わらずの規格無視っぷり。<br />
これなにが問題かというと割と便利なので思わず使ってしまうところ。]]></content:encoded>
    <dc:subject>C++</dc:subject>
    <dc:date>2014-10-02T22:29:32+09:00</dc:date>
    <dc:creator>plasma_effect</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>plasma_effect</dc:rights>
  </item>
  <item rdf:about="https://dtyazsk.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/%E6%A5%BD%E3%81%97%E3%81%84%E3%82%AA%E3%83%95%E3%83%AC%E3%83%9D">
    <link>https://dtyazsk.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/%E6%A5%BD%E3%81%97%E3%81%84%E3%82%AA%E3%83%95%E3%83%AC%E3%83%9D</link>
    <title>楽しいオフレポ</title>
    <description>オフレポを書かなければいけないらしい。前回の名古屋オフと夏コミのオフレポを踏み倒してるマンに何を言ってるんだろうか。とりあえずざっくり書く。長い文章は苦手だ。TwitLogerなんてなかった。深夜のオフレポ60分勝負はもっとなかった。

1週間前のことである。Skype通話でオフ会をする話を聞いた。...</description>
    <content:encoded><![CDATA[オフレポを書かなければいけないらしい。前回の名古屋オフと夏コミのオフレポを踏み倒してるマンに何を言ってるんだろうか。とりあえずざっくり書く。長い文章は苦手だ。TwitLogerなんてなかった。深夜のオフレポ60分勝負はもっとなかった。<br />
<br />
1週間前のことである。Skype通話でオフ会をする話を聞いた。名古屋には行きで3時間以上かかるのでそんなにホイホイ行くわけにはいかないのだがplsさんとひなぶさんが来るらしいので行くことにした。<br />
<br />
さて日付はとんで9/14。家を7時50分に出て近鉄電車を乗り継ぎながら名古屋に行く。残念なことに集合日時しか聞いてなかったので集合場所がわからなかったという。くろっくさんに聞いて移動した。ひすいちゃんとくろっくさんの顔は知っている。plsさんはスーツ、ひなぶさんはひなぶさん感が出ていた(ほんまか)。こんな人だったのかとか思いつつ。あ、plsさんにぷっちょもらった。というわけでマウンテンに行くわけである。地下鉄で行くのだがひすいちゃんが先頭にいた気がする。なんでじゃ。<br />
<br />
マウンテン。今回は定休日ではないので行列ができていた。とりあえず並ぶのだが途中でひなぶさんが飲み物を買いに行く。なかなか帰ってこない。Twitterを見る。「登山していたはずがスーパーで涼んでる」帰って来い。<br />
そんなことを言ってたらひなぶさんが帰ってきた。全員分の飲み物を買ってきてくれたようである。飲み物代を渡すべきだった。<br />
というわけで登山。メニューは<br />
・甘口抹茶小倉スパ&amp;ゴーヤとウコン(plasma_effect)<br />
・アザラシまんま&amp;妹のラムネ(くろっく)<br />
・大人のお子様ランチ&amp;大人のラムネ(ひすい)<br />
・辛口ナマズ煮込みスパ&amp;黒酢スカッシュ(ひなぶ)<br />
・レッドマウンテンなんとか&amp;名古屋なんとか(pls)<br />
まず甘口抹茶小倉スパが出てきたのだが他の人を待ってると生クリームが溶けるので先にいただく。<br />
<br />
スパ自体は抹茶の味だ。それ以上でもそれ以下でもない。抹茶。まぁ食える。一方上に乗ってる生クリーム。これが曲者で、スパが熱を持っている以上ほっとくと溶ける。これがスパと混じったものが非常にヤバイ。とりあえず速攻で半分は削る。残り半分は気合。途中で内部に入ってたあんこを食べた。うまい、うますぎる。あんこはここまでうまかったのか。<br />
水、さくらんぼ、みかんっぽい何か(覚えてない)の力を借りながら5人のなかで最速で完食。まぁ出てくるのが早かっただけだが。勝利の余韻に浸りながら食う菓子はうまい。ゴーヤとウコン？なんかよくわからん味だったけど普通に飲めたで。<br />
<br />
さて、最初の登頂者となったので傍観者する。くろっくさんが選んだアザラシとひすいちゃんが選んだお子様なんとかは当たりだったらしい。一方でひなぶさんはハズレだったっぽい。plsさんは結局当たりかハズレかどっちだったんだ。<br />
2番目の登頂者はくろっくさん。妹のラムネとかいう最高級に危ないラムネを飲んでた。ていうかみんなで飲んだ。5人で危ない表現をしまくった。なんなんだこの集団。<br />
3番目はplsさん。乗ってた団子が辛いだけで味がしないとんでもない代物だった。<br />
4番目はひなぶさん。今回は登頂できたらしい。<br />
ラストはひすいちゃん。当たりを引いたのだが少食なせいで食べるのに時間がかかってた。ちなみにお口がさみしかったのでトマトをパクったのだが救済という判定らしい。<br />
5人全員登頂したので今回は食べ物を粗末にしなかったらしい。<br />
で、ここでひなぶさんがまず全員分の食事代を払い後からひなぶさんに払う形にした。このことをしっかり覚えておいて下さい。<br />
<br />
そのあと大須に行ったわけだがとりあえず「聖地の近くのお店に行った」「聖地に行った」「イラスト展的なところに行った」の順番である。<br />
聖地の近くのお店にはなんか知らんけど入ってなんか知らんけどカード見てた。ちなみに聖地と間違って入ったらしい。<br />
その次に聖地、グッドウィルに行く。なぜ聖地かわからない人(ほとんど)に説明すると要するに昔神霊廟の体験版があった。「昔神霊廟の体験版があった。」大事なことなので二回言いました。あと強調しました。グッドウィルで神霊廟が撤去されてることを確認してなんか物色してた。<br />
そしてイラスト展的なものに行く。正直イラストにはあまり興味はなかったがとりあえず回ってみて「あーかわいいなぁ」とか思ってた。うん。<br />
<br />
で、次にゲーセンに行くことになった。はい、言い出した人です。2つあったがタイステに行った。STGがない方である。あ、ダライアスバーストがあった。まぁ大復活はリアル1時間かかるもんな。タイステではくろっくさんと弐寺&amp;SDVXで遊んだ。<br />
まず弐寺。筐体選択をミスったのか2P側の7がはまることがしばしばというクソ筐体。<br />
1曲目はElement of SPADA(1P側SPN、2P側SPH)とりあえず一度易つけてるのでもう一回易した。<br />
2曲目は中華急行(両者SPN)、☆2なのでエクハした。フルコンしたかったが7がな&hellip;。<br />
ラストは冥(両者SPN)、正直何回この譜面で難したかわからないしそろそろエクハすべきなんだろうが低速抜け補正入ってるのにエクハできるわけがない。<br />
次にSDVX。このカードでは3クレ目のプレイ(その時点では2クレ目だと思ってたがそういえば2クレしてたことに今気づく)<br />
1曲目2曲目はなにか忘れたがとりあえずLv10とLv11であることは覚えてる。まぁクリアしたので問題はない。<br />
3曲目はIdola。ADVはLv12だったがなんとかクリア。<br />
<br />
そのあとまんだらけでクソゲーをした。「他の人の性癖を予想して好きそうな同人誌を持ってくるゲーム」追加ルールがあったが無視して即最下位になりました恥ずかしい。<br />
あ、そのときにふにさんの同人誌が2つあったのでどっちも買った。おそらくふにさんが最高級に頭おかしい時期の本だと思う。完璧に頭おかしい。<br />
<br />
「そのあと」が多いがそのあとは晩御飯&hellip;と言いたいところだが、君らには帰ってもらう。<br />
要するに終電逃しそうだったので帰った。帰り道はいつも通りなので問題はないはずだったが一つ問題が発生。上で建て替えてもらった額を払って無かったという話。いつ払うのって話だがいつ払うんだ？ていうか同じことを2年前にもやらかしてるので学習しないなぁとか。<br />
<br />
どうでもいいがくろっくさんのオフレポ見たらいなかったはずののなめさんがいた事になってて捏造オフレポ勢怖いなぁと。あとplsさんが危ない人だった。ひすいちゃんは有能。ひなぶさんごめんなさい。plasma-effect/bmp_traitsの進捗もしたので満足。お疲れ様でした。]]></content:encoded>
    <dc:subject>未選択</dc:subject>
    <dc:date>2014-09-15T00:12:14+09:00</dc:date>
    <dc:creator>plasma_effect</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>plasma_effect</dc:rights>
  </item>
  <item rdf:about="https://dtyazsk.blog.shinobi.jp/kancolle/%E3%83%80%E3%83%A1%E3%82%B3%E3%83%B3%E4%BD%BF%E3%81%A3%E3%81%9F%E6%84%9F%E6%83%B3">
    <link>https://dtyazsk.blog.shinobi.jp/kancolle/%E3%83%80%E3%83%A1%E3%82%B3%E3%83%B3%E4%BD%BF%E3%81%A3%E3%81%9F%E6%84%9F%E6%83%B3</link>
    <title>ダメコン使った感想</title>
    <description>永LNBを次の更新にすると決めてたが当分先になりそうなのでやめた。


今日初めてダメコン使いました。感想をいうと「もうダメコン特攻はしない」です。
艦これのシステムでは撃沈した艦はサルベージできないので基本的に大破したら撤退するのがセオリーですがダメコンを積んでてかつ次がボス戦だったので大破進撃さ...</description>
    <content:encoded><![CDATA[永LNBを次の更新にすると決めてたが当分先になりそうなのでやめた。<br />
<br />
<br />
今日初めてダメコン使いました。感想をいうと「もうダメコン特攻はしない」です。<br />
艦これのシステムでは撃沈した艦はサルベージできないので基本的に大破したら撤退するのがセオリーですがダメコンを積んでてかつ次がボス戦だったので大破進撃させましたが、ダメコン積んでるとわかってても精神的に来るものがありますね。<br />
ちらっと見えた撃沈の文字と『BGMが流れてる状態での轟沈ボイス』がかなりきついものがあります。ダメコン積んでるとわかってても。いやホントあれはダメ。<br />
<br />
そもそもうちの鎮守府では飛鷹と三日月が死にかけ担当だったのですがホントに死にかけさせてみるとかなりひどい扱いしてたことがわかりました。飛鷹さんごめんなさい。<br />
ロストしないとはいえ轟沈ボイスはもう聞きたくないです、精神的に病んでしまいます。これでは。<br />
<br />
ていうか大破しないようにしっかり育てろよ感も否めないのでこれからはじっくり通常海域を攻略することにします。]]></content:encoded>
    <dc:subject>艦これ</dc:subject>
    <dc:date>2014-09-09T12:27:18+09:00</dc:date>
    <dc:creator>plasma_effect</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>plasma_effect</dc:rights>
  </item>
</rdf:RDF>
