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
> 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<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.


Daniel Wallin

Boost list run by bdawes at, gregod at, cpdaniel at, john at