Boost logo

Boost :

Subject: Re: [boost] [mpl] mpl::c_str fails for mpl::push_back
From: vicente.botet (vicente.botet_at_[hidden])
Date: 2010-11-07 03:40:13

----- Original Message -----
From: "vicente.botet" <vicente.botet_at_[hidden]>
To: <boost_at_[hidden]>
Sent: Sunday, November 07, 2010 8:38 AM
Subject: Re: [boost] [mpl] mpl::c_str fails for mpl::push_back

> Do you have a workaround I can use to preserve it?

I have tried to add a value_type trait

    template<typename Sequence>
    struct value_type {
        typedef typename Sequence::value_type type;

changed the c_str to use the type trait

    template<typename Sequence>
    struct c_str
        typedef typename mpl::end<Sequence>::type iend;
        typedef typename mpl::begin<Sequence>::type i0;
        #define M0(z, n, data) \
        typedef \
            typename mpl::aux_::next_unless<BOOST_PP_CAT(i, n), iend>::type \
        BOOST_PP_CAT(i, BOOST_PP_INC(n));
        #undef M0

        typedef c_str type;
        static typename value_type<Sequence>::type const value[BOOST_MPL_LIMIT_STRING_SIZE+1];

and defined the following specializations:

namespace boost { namespace mpl {
template<typename T, T N>
struct value_type<integral_c<T,N> > {
    typedef T type;
template<typename T0,typename T1,typename T2,typename T3,typename T4,
    typename T5,typename T6,typename T7,typename T8,typename T9,
    typename T10,typename T11>
struct value_type<vector12<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11> > {
   typedef typename value_type<T0>::type type;

Then we are able to use c_str on any sequence providing the specialization. Of course compile checking that the sequence size is not greater than BOOST_MPL_LIMIT_STRING_SIZE should be convenient.

If I'm not wrong this change should not break working user code.

Is there a possibility to add this trait to Boost.MPL and the corresponding specialization and move the c_str function to a standalone file ?


Boost list run by bdawes at, gregod at, cpdaniel at, john at