2011-07-01から1ヶ月間の記事一覧

C++0x で不動点コンビネータ

C++

Haskell では定義をそのまま書き下すことで不動点コンビネータを定義できるそうですが, fix :: (a -> a) -> a fix f = f (fix f) 魔法言語 C++0x も負けてはいないはずです. template <class F> struct fix_result { F m_f; template <class ...Args> auto operator()(Args &&...ar</class></class>…

コンパイル時に配列を結合する

C++

元ネタ constexpr で扱えて,実行時の効率もよいデータ構造+アルゴリズム - とくにあぶなくないRiSKのブログ arrayにpush_back, push_fonrt - bigsleepの日記 index_tuple の技法を使って,constexpr 関数の呼び出しを 2 回に抑える実装を考えました. #inc…

double でテンプレートメタプログラミング

C++

double は非型テンプレートパラメータに使えないので,そのコンパイル時計算は constexpr 関数に頼るのが一般的だと思いますが,テンプレートでもやってやれないことはありません. // 有名な階乗の計算を double で行います // Gamma function ではありませ…

そろそろ result_of について

result_of とは 呼び出し可能な型と引数の型から,呼び出した場合の戻り値の型を導出するメタ関数です.例を示しましょう. typedef int (*char_to_int)(char); int digit_to_int(char c) { return c - '0'; } // char_to_int 型に,char 型の引数を渡した時…

PStade.Egg.Monad で遊んでみた

Undocumented ですが,pstade/egg/monad/ 以下に Monad クラスと boost::optional をそのインスタンスとしたものがあります.実用向きとは言えませんが,ちょっと遊んでみました. monad_optional_test.cpp #define BOOST_RESULT_OF_USE_DECLTYPE #include <cmath> </cmath>…