
"Daniel Wallin" <dalwan01@student.umu.se> wrote in message:
I don't know if it's better, but you can get rid of the SFINAE by doing something like:
struct _ {};
template<class T, int N = 3> struct rebind : rebind<T, N - 1> {};
template<class T> struct rebind<T, 0> { typedef T type; };
template<template<class> class T, class P1> struct rebind<T<P1>, 1> { typedef T<_> type; };
template<template<class, class> class T, class P1, class P2> struct rebind<T<P1, P2>, 2> { typedef T<_, _> type; };
template< template<class, class, class> class T , class P1, class P2, class P3
struct rebind<T<P1, P2, P3>, 3> { typedef T<_, _, _> type; };
Or you could just use template_arity to pass the arity to the specialized template, instead of recursively trying every arity. I suspect template_arity has to do something equivalent to this though, so maybe this saves a few instantiations.
Thanks for the suggestions. I was hoping there might be something radically simpler. I think I"m happy to stick with enable_if and template arity (on platforms which require it), since it states the intent very clearly. It can also be encapsulated better than the example I posted, e.g., enable_by_arity< T<P>, 1 > ... .
HTH, -- Daniel Wallin
Jonathan