Boost logo

Boost :

From: David Abrahams (dave_at_[hidden])
Date: 2004-07-14 14:23:04


Toon Knapen <toon.knapen_at_[hidden]> writes:

> Matthias Troyer wrote:
>
>
>> How would you do a BOOST_WORKAROUND in a template code where you
>> might not know the value of the static constant? I think that any
>> constant depending on a template parameter will still have to be
>> treated like it is done now.
>
> Sorry but I fail to understand what you are saying. Anyway what I
> suggest is to use BOOST_WORKAROUND for implementing the enum-trick
> wherever BOOST_STATIC_CONSTANT would use the enum-trick in case
> BOOST_NO_INCLASS_MEMBER_INITIALISATION would have been defined.

Ultimately I think the right answer is to use

      mpl::integral_c<some_type, some_value>

or

      mpl::bool_<some_value>

etc.

everywhere as Paul Mensonides suggested. One reason is that it
centralizes the out-of-line static member definitions.

I'm just not sure how it interacts with all the low-level hacks needed
for broken compilers. To get the ::value member (admittedly this is
just a convenience) into a metafunction you have to use forwarding via
inheritance:

    template <class T>
    struct some_trait
      : mpl::bool_<(some-calculation-using-T)>
    {};

so it may mean breaking down implementations this way:

    template <class T>
    struct some_trait_impl
    {
       typedef mpl::bool_<(some-calculation-using-T)> type;
    };

    template <class T>
    struct some_trait
      : some_trait_impl<T>::type
    {};

But I truly believe this is the optimal approach.

-- 
Dave Abrahams
Boost Consulting
http://www.boost-consulting.com

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk