|
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