|
Boost : |
From: Aleksey Gurtovoy (agurtovoy_at_[hidden])
Date: 2002-12-09 04:47:52
David A. Greene wrote:
> Aleksey Gurtovoy wrote:
> > It _is_ possible to implement a single template along the
> > lines of the SHAZAM template you've mentioned early in the
> > thread:
> >
> > template<typename T, typename U, typename V>
> > struct my_type { ... } // Note: no ::type member
> >
> > typedef SHAZAM<my_type<int, _1, _2> > generator;
> >
> > typedef generator::template apply<char, float>::type
> my_type_inst;
> >
> > but not at the user side - the library internal mechanisms
> > needs to be made aware of it.
Actually, I lied - on a conforming compiler you can do the following:
template< typename T, typename U, typename V >
struct my_type {}; // Note: no ::type member
// declare 'my_type' a "reduced" metafunction
REDUCED_METAFUNCTION_SPEC(3, my_type)
// test it
typedef lambda< my_type<int,_1,_2> >::type f;
typedef f::apply<char,short>::type t;
BOOST_STATIC_ASSERT((is_same< t, my_type<int,char,short> >::value));
where REDUCED_METAFUNCTION_SPEC is as simple as this:
#define REDUCED_METAFUNCTION_SPEC(n, name) \
namespace boost { namespace mpl { \
template<> struct meta_fun##n< name > \
{ \
template< BOOST_PP_ENUM_PARAMS(n, typename T) > \
struct apply \
{ \
typedef my_type<BOOST_PP_ENUM_PARAMS(n,T)> type; \
}; \
}; \
}} \
/**/
> > I considered this before, - as
> > well as the option of directly supporting the "reduced"
> > metafunction form, - and the latter is currently my
> > preference. Will see if something changes after I actually
> > implement it (for one, it might slow down the lambda
> > significantly, - but we'll see).
>
> Thanks for considering this. I think it will be quite useful. I look
> forward to seeing what you come up with!
Well, it turned out to be a little bit more complicated than I had foreseen,
so it's not there yet. Please stay tuned!
Aleksey
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk