GCC 4.3 で variadic class template 内で variadic class template をインスタンス化するための workaround

GCC 4.3 (GCC 4.3 の正式リリースはまだです.正式リリース前の snapshot の話です) でいろいろ遊んでたけれど, variadic class template の定義で直接他 (もしくは自分) の variadic class template をインスタンス化しようとするとエラー出る.おそらく GCC が出さなくて良いエラーまで出してる.これの workaround としては関数テンプレートの定義を挟めばよいみたい.
以下のコードは GCC 4.3 の最新 snapshot で正常にコンパイルできます.

#include <cstddef>

template< class T >
struct identity
{
  typedef T type;
};

template< class T, T t >
struct integral_constant
{
  typedef integral_constant type;
  static T const value = t;
};

template< class T >
struct increment;

template< class T, T t >
struct increment< integral_constant< T, t > >
  : public integral_constant< T, t + 1 >
{};

template< class... Args >
struct arity;

template< class... Args >
typename arity< typename Args::type... >::type arity_helper( Args... );

template< class T, class... Args >
struct arity< T, Args... >
{
public:
  typedef decltype( arity_helper( identity< Args >()... ) ) pretype;
  typedef typename increment< pretype >::type type;
};

template<>
struct arity<>
  : public integral_constant< std::size_t, 0 >
{};

int main()
{
  typedef arity<>::type _0;
  static_assert( _0::value == 0, "error" );
  typedef arity< int >::type _1;
  static_assert( _1::value == 1, "error" );
  typedef arity< int, double >::type _2;
  static_assert( _2::value == 2, "error" );
  typedef arity< int, double, bool >::type _3;
  static_assert( _3::value == 3, "error" );
}

やたー.これで variadic template で tuple を書くめどが立ったどー.