Boost.mpl11を読んだ
自分の大雑把な理解。間違ってたら指摘してもらいたい
mpl11は基本的に遅延評価である。ゆえに極力計算しない
Boxed typesとは多くのメタ関数やtype_wrap などT::typeとできる型のことである
mpl11のメタ関数は基本的にboxed typeを引数に要求する
遅延評価のため、また記法の簡易化のためである
using F=Metafunc<Box>;//このタイミングではまだなにも評価されていない using a=F::type;//このタイミングでBox::typeを呼び出し、遅延評価される
これはListでも例外ではない。List::typeは自身の型を返す
List<int>::type;//==List<int>
というのは
F<Box>type; F<List<char,int>>::type;
この二つをList版Box版と作り分けるのはよくない
ゆえにListはboxed typesであり、自身の型を返す
template<class...T> struct List { using type=List; };
Lifted metafunctions
T::apply<...>
と出来る型Tのことである
mpl11では直接従来のメタ関数、つまりテンプレートテンプレートパラメータを扱わない
メタ関数もタイプリスト等mpl11の恩恵を受けることができる
関数オブジェクトのようなものである
ちなみにこれもboxed typesであり自身の型を返す
type class
C++的なclassとは関係ない。Haskellの型クラスのことである
C++風にいうとtraitとかコンセプトとかそんな感じ
例えばC++11なタイプリストとC++03時代のModernC++Designに載ってるタイプリストがあるとして、この二つでは当然先頭の要素を返す関数headの実装は異なる
template<class...T> struct List;//C++11 template<class Head,class Tail> struct cons;//c++03
これをtraitsを使って実装するのがtype classである
headを実装する型はhead_implのように実装する形名は*_implで統一するらしい
mpl_datatypeについて
実装とかで使う
mpl時代のIteratorについて
つらいのでやめた
monoid ,Functor, Monadoについて
型クラスである。要するにtraitsである。恐れることはない
例えばMaybe(boost::optional的なもの)はFunctorであり、Monadoである
functorはfmapを定義する
fmapはfunctorと関数を取る関数であり
fmapはmaybeであればmaybeがnothing(無効値)であればnothingを
有効値であれば関数を適用して返す
モナドはそれを連鎖できるようにした感じ