template <typename T0> struct tuple { typedef tuple<int> tail; }; template <> struct tuple<int> { }; template <typename L> struct length { static const int i = length<typename tuple<L>::tail>::i; }; template<> struct length<tuple<int> > { static const int i = 1; }; template <int> struct M {}; template <typename A> M<length<tuple<A> >::i > foo (A*); template <typename A> M<length<tuple<A> >::i> foo (const A*); const int i1 = 3; void bar() { foo (&i1); }