variadic template事始め

C++0xでvariadic templateを使って可変数引数の数を数えるプログラムを組んでみる。
使ったのはg++ Ubuntu 4.3.2-1ubuntu12
オプションは
g++ -g -Wall -std=c++0x -o variadic_templ variadic_templ.cpp

#include <iostream>
#include <typeinfo>

template <typename... arg>
struct length;

template <typename arg, typename... rest>
struct length<arg, rest...>
{
	enum {
		value = 1 + length<rest...>::value
	};
};

template <typename arg>
struct length<arg>
{
	enum {
		value = 1
	};
};

int main()
{
	typedef length<int, short, char, long, unsigned int> type_list;
	std::cout << typeid(type_list).name() << std::endl;
	std::cout << type_list::value << std::endl;

	return 0;
}

最初はよー分からんかったが、id:faith_and_braveさんとこのコードを見てて不完全型宣言してから特殊化としてtemplate argumentが可変のものを用意すればいいのかなー?とやったら通った。
あとで規格の該当個所読んで裏取りしないとな・・・

しかしなれるまで苦労しそうだ・・・
lisp風連結リストだとわかりやすかったんだけどなぁ・・・