|
Boost : |
From: David Abrahams (dave_at_[hidden])
Date: 2003-01-31 13:30:12
"Fernando Cacciola" <fernando_cacciola_at_[hidden]> writes:
> Hi, I'm having the following problem (?) with mpl::integral_c.
>
> Since it is intended to encapsulate an "Integral Constant",
> I thought that it somewhat superseded BOOST_STATIC_CONSTANT.
> IOWs, I figured that if I have something of the form:
>
> struct X
> {
> BOOST_STATIC_CONSTANT( Type, ID = Val ) ;
> } ;
>
> it could be rewritten as:
>
> struct X
> {
> mpl::integral_c<Type,Val> ID ;
> } ;
struct X
{
typedef mpl::integral_c<Type,Val> ID ;
} ;
, maybe.
> The benefit is that X::ID becomes a lot more usable on those
> compilers with poor non-type template parameter support.
>
> Specifically, I designed the traits class of the Numeric Conversion Library
> to expose mpl::integral_c and mpl::bool_c in place of BOOST_STATIC_CONSTANT
> for its different value fields.
>
> So, first of all, do you agree that the mpl form is better?
It's "better", but maybe not for the reasons you think ;-). [It has
to do with metafunction/metadata polymorphism]
> Unfortunately, while I was just about to release the library for
> formal review, I tested it with gcc3.2 and stumped into the
> following:
>
<snip>
> The errors show that the problem is related to the definition of next,prior:
>
> typedef integral_c<T, (value + 1)> next;
> typedef integral_c<T, (value - 1)> prior;
>
>
> Solution:
>
> There are two possibilities AFAICT:
>
> (a) since there is int_c<> already, remove next/prior from integral_c
> altoghether.
> (b) add a special enum_c<>.
I think the fix is much easier than either of those:
typedef integral_c<T, static_cast<T>(value + 1)> next;
typedef integral_c<T, static_cast<T>(value - 1)> prior;
-- David Abrahams dave_at_[hidden] * http://www.boost-consulting.com Boost support, enhancements, training, and commercial distribution
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk