可変引数テンプレートでの型リストまとめ

C++0xでは、可変引数テンプレートという機能が追加されます。
これを使うと、テンプレートパラメータを可変個受け取ることができ、

template <class... Args> // ...と書くと可変引数テンプレートになる
class tuple;

可変引数テンプレートは型のリストと見なすことができます。

tuple<int>             t1; // 要素1つ(int)の型リスト
tuple<int, char>       t2; // 要素2つ(int, char)の型リスト
tuple<int, char, long> t3; // 要素3つ(int, char, long)の型リスト

ということで、型リストがどこまでできるか試すために
リスト処理を作ってみました。


headとtail - 先頭と後部

length - 長さ

at - I番目の型を取得

concat - 型リストの連結

cons - 型を追加

take - 先頭N個の型を取得

drop - 先頭N個を除いた型を取得

map - 全ての型にメタ関数を適用

filter - 条件抽出

add_if_c/add_if - 述語を満たす場合に型を追加する(filterの実装用)

reverse - 逆順

take_while - 先頭から述語を満たす型を取得

drop_while - 先頭から述語を満たす型を除外する

replicate - 型TをN個含む型リストを生成

all - 全ての型が述語を満たすか

any - いずれかの型が述語を満たすか

zip - 2つの型リストをペアにする

transpose - 行と列を変換する

init/last - 前部と末尾



【まだ作ってないもの】
init/last、無限リスト


id:melponn作】
foldr(と、filter、reverseを再帰せずに書いてる)


【eldeshさん作】
foldl

foldl(改良版)



型レベルプログラミングの会でこのネタ話してきました。
まだまだ改良の余地はありそうです。
何か思いついたら随時更新します。