Boost logo

Boost :

From: Daniel Wallin (dalwan01_at_[hidden])
Date: 2004-10-26 16:14:43


Jonathan Turkanis wrote:
> Dear All,
>
> I'm trying to write a metafunction rebind which, when fed a specialization
> T<P1,...,Pn> of an n-ary template T, returns T<mpl::_, ...., mpl::_>. This is
> straightforward if default template arguments are not considered when matching
> template template parameters. (See
> http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#150.) E.g.,
>
[snip code]
>
> I have two questions:
>
> 1. is my analysis correct?

I think so.

> 2. is there a better solution?

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.

HTH,

-- 
Daniel Wallin

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk