Boost.mpl11を読んだ

ldionne/mpl11 · GitHub

自分の大雑把な理解。間違ってたら指摘してもらいたい

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を
有効値であれば関数を適用して返す
モナドはそれを連鎖できるようにした感じ