|
Boost : |
From: Jonathan Turkanis (technews_at_[hidden])
Date: 2004-10-26 15:23:20
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.,
template<typename T>
struct rebind { typedef T type; }
template<template<typename> class T, typename P>
struct rebind< T<P> > {
typedef T<mpl::_> type;
};
template<template<typename, typename> class T, typename P1, typename P2>
struct rebind< T<P1, P2> > {
typedef T<mpl::_, mpl::_> type;
};
etc.
On GCC 3.4.1 (and I assume earlier versions too) this leads to ambiguity errors.
To workaround this problem, I've resorted to using enable_if and
mpl::aux::template_arity, e.g.,
template<typename T, typename Enabler = void>
struct rebind { typedef T type; }
template<template<typename> class T, typename P>
struct rebind< T<P>,
typename
enable_if<
mpl::equal_to<
typename mpl::aux::template_arity< T<P> >::type,
mpl::int_<1>
>
>::type >
{
typedef T<mpl::_> type;
};
I have two questions:
1. is my analysis correct?
2. is there a better solution?
Best Regards,
Jonathan
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk