|
Boost : |
From: Terje Slettebø (tslettebo_at_[hidden])
Date: 2002-08-11 09:32:09
>From: "David Abrahams" <dave_at_[hidden]>
>>From: "Terje Slettebø" <tslettebo_at_[hidden]>
>> This uses the same "rebind" method used in MPL, and with the help of Mat
>> Marcus, I've got this to work on MSVC 6, too. The "T::template apply<N>"
>> syntax gave an ICE without it.
>I hope you just used the built-in MPL "apply" metafunction to do that:
Yep, I did. :)
"value" is defined simply like this:
template<typename T, int N>
struct value
{
typedef typename apply1<T,int_c<N> >::type type;
};
To aid readability, the "apply1" is wrapped like this.
The "int_c" above is also just to wrap the value in a type, as "apply"
expects a type, not value.
This system requires a change in the value types, though, such as this:
template<typename T, T N>
struct integral_c
{
BOOST_STATIC_CONSTANT(T, value = N);
...
template<typename T>
struct apply
{
typedef integral_c<T::value> type;
};
};
I earlier called the member template "rebind", but changed it to "apply", so
that it could be used with "apply1".
When I first made it, I didn't realize that capability was already in MPL
(with workaround for MSVC). However, I first tried it as explained in this
article (http://lists.boost.org/MailArchives/boost/msg20915.php), that Mat
pointed me to, for an explanation of a workaround. He also said I could use
mpl::apply for this, by reorganizing the code a little (as shown above), and
it worked fine, as you said, too.
It wasn't easy to find this, as I haven't found "apply" documented anywhere,
at least not in the reference docs
(http://www.mywikinet.com/mpl/ref/Table_of_Content.html). Is it documented
anywhere?
Regards,
Terje
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk