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 を書くめどが立ったどー.