ないブログに表示されています。新しい記事を書く事で広告が消えます。ユーザー定義リテラル「VS2015の記事を見てたはずだがいつの間にかconstexprの記事になっていた」という意見が出た。2015がリリースされた。VC++も新しくなったわけだがそのうち新しく追加された機能を出来る限り毎日記事にしようと思う。本日はそのpart02、ユーザー定義リテラルだ。ある型の一時変数を作るのにわざわざ関数を使いたくはないという時があったりなかったりする。int型の100を表すようにユーザー定義のリテラルを使いたい。operator""でそのようなユーザー定義のリテラルを作ることができる。2);}ユーザー定義リテラルにはいくつか成約がある。doubleといった一部の型しか使えない。main(){}また_(アンダーバー)から始まらないリテラルは予約されてるので使うと色んな人に怒られる。コンパイラにも怒られる。main(){}あと規格的には""と_の間に空白文字(スペースなど)が必要...らしい。intの他に使える型を紹介する。"test"_hoge;}あとはwchar_tとかそこら辺である。ユーザー定義リテラルでは基本的にtemplateが使えない。templateを使用できる唯一の例が存在する。'5'>}この場合引数は付けない。intのみに対応する。constexpr久しぶりにブログ開いたら広告出てて泣いた。いうわけで記事を書くことにする。2015がリリースされた。VC++も新しくなったわけだがそのうち新しく追加された機能を出来る限り毎日記事にしようと思う。本日はそのpart01、constexprだ。constexprはC++11で追加された機能で、現在のC++14では更にパワーアップしているのだが、Microsoftの脳みそが2011年から進んでないのでC++11版のconstexprを紹介する。コンパイル時において定数式はその場で計算される。定数式とは例えば以下の様なもの。5;//明らかに15}一方でコンパイル時に使える定数(以下コンパイル時定数)が存在する。定数式で初期化されているconst定数がそれ。上の例で言えばvもuもコンパイル時定数である。コンパイル時に使えるとは例えばtemplate引数に渡せる。test<v>::get();}この例ではvはコンパイル時定数なのでtemplateクラスtestの引数に渡せる。一方でstaticメンバ関数getは定数式ではないのでuはコンパイル時定数でない定数である。この場合uはtemplate引数に渡せない。変数に対するconstexprは変数がコンパイル時定数であることを保証する指定子である。型はあくまでconstであり、constexprではない。hoge();//NG}一方で関数に対するconstexprはその関数を定数式として扱えるようにする指定子である。constexpr関数の中身は実質的にreturn文一つでなければならない。fact(5);//OK}return文一つといっても条件演算子が使えるので関数型言語に慣れている人なら親しみを持てるのではないだろうか。定数式とできるのは組み込み型がまず上げられるがユーザー定義でconstexpr定数、またはconstexpr関数に使えるクラスも作ることができる。定数式に使える型をリテラル型と言う。リテラル型には組み込み型やその配列がまず考えられるが、それらを組み合わせたユーザー定義型でリテラル型となる条件は以下のとおり。以下の様なクラスがリテラル型となる。p.y_;}そういえば上のコードでわかるようにVS2015ではムーブコンストラクタもdefault宣言できるようになった。今までできなかったほうがおかしい。リテラル型やconstexprに関する活用法はここでは書かない。様々な場所で論じられているのでそちらを参考にして欲しい。実はVC++のconstexprでバグとかないかのチェックとかまだしてないしもしかしたら規格に反する動作をするかもしれない。Fri.C++2zでは動的関数生成が追加されるC++2zでは文字列から関数オブジェクトを生成されるtemplate関数compilingがfunctionalヘッダに追加される。std名前空間における宣言は以下のとおりだ。last);使い方は以下のとおりだ。<<std::endl;}FunTは返り値のstd::functionの型を指定し、Alignmentはその関数で確保される最大のメモリ容量を指定する。ここで注意したいのはcompilingでは以下の機能しか使えない。関数呼び出しやユーザー定義型が使えないことには要注意だ。文字列が不合理な場合以下の様な例外が投げられる。複数の例外に当たる場合上のものが優先される。・文法的に意味を成さない(typedefや関数が使われている場合含む)→std::bad_function_parsing・返り値がFuncTで指定したものと合わない→std::bad_function_type・Alignmentで指定した以上のメモリを必要とする→std::memory_over_exception実行時に文字列を与えてそこから関数を生成することも可能となる。将来的にはcompilingの文鳥言語版compiling_bunchoも導入される予定だ。Reserved.忍者ブログ[PR]。