« 納豆…ムッキー!! | トップページ | あーひゃっひゃっひゃっひゃ (*゚∀゚) »

テンプレート1

Modern C++ Design をだいぶ理解できてきました。これというのもウチのプログラマボスのおかげです。いやー
昨年までテンプレートのテの字もわかんなかった僕が…。タイプリストまで理解しました。ていうかタイプリスト
の発想のすごさに脱帽。
テンプレートを再帰させるなんて…普通考えつかないって。
まあ、昔どこかでコンパイル時に「フィボナッチ数列」の計算を行うサンプルを見たので、それを考えれば
不可能ではないのかもしれないけどとにかくすごい。

複数の型を持つテンプレートクラスの作り方は普通

template<typename T1,typename T2>
struct Foo
{
    T1 t1;
    T2 t2;
};

んで特殊化すると

template<typename T1>
struct Foo<T1,double>
{
    T1 t1;
    double t2;
};


template<typename T2>
struct Foo<char,T2>
{
    char t1;
    T2 t2;
};

template<>
struct Foo<char,int>
{
    char t1;
    int t2;
};

ってな感じです。ここまでは僕でもわかります。アンドレイアレキサンドレスク氏のすごいのはここからで

template<typename U , typename L >
struct TypeList
{
    typedef U Head;
    typedef L Tail;
};

アッーーーー!

typedefを使うなんて…。
さらに

typedef TypeList< char , TypeList<int,double> > TripleList;

とすれば、型の並びを表現できます。ただしいちいち書いていくのは面倒なので
次のようなマクロを用意します。

#define TYPELIST_1(T1) TypeList<T1,NullType>
#define TYPELIST_2(T1,T2) TypeList<T1,TYPELIST_1(T2)>
#define TYPELIST_3(T1,T2,T3) TypeList<T1,TYPELIST_2(T2,T3)>

とはいえ、このマクロを書くのも面倒なので、僕はAWK言語を用いて32まで
用意しました。そう、メタプログラミングを他言語を用いて記述!まさにメタメタプログラミング!!

「で、どこで使うのよ」と言われそうなので、一例。
通常可変長引数をとる関数は、それぞれの型がわかりません。

void Sample(...)
{
    ?
}

ところが、タイプリストを一緒に渡してあげれば、順順に方がわかるのですよ。奥さん!
この他の使い方も検証してみるつもりですが、それはもうちょっとModern C++ Design を読んでから。
難しいことに変わりはないので…。

|

« 納豆…ムッキー!! | トップページ | あーひゃっひゃっひゃっひゃ (*゚∀゚) »

プログラミング(C++)」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: テンプレート1:

« 納豆…ムッキー!! | トップページ | あーひゃっひゃっひゃっひゃ (*゚∀゚) »