$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: David B. Held (dheld_at_[hidden])
Date: 2002-10-04 18:13:34
"Aleksey Gurtovoy" <agurtovoy_at_[hidden]> wrote in message
news:4034600A4760D411B8720001031D84FB01096494_at_postoffice.office.meta...
> [...]
> And here's an equivalent definition that accepts both meta-function
classes
> and lambda expressions:
>
>     template< typename F, typename T > struct le_apply
>     {
>         typedef typename mpl::lambda<F>::type f_;
>         typedef typename mpl::apply1<f_,T>::type type;
>     };
>
>     template <
>           typename T
>         , typename OwnershipPolicy
>         , typename ConversionPolicy
>         , typename CheckingPolicy
>         , typename StoragePolicy
>         , typename sp_ = typename le_apply<StoragePolicy,T>::type
>     >
>     struct smart_ptr
>         : sp_
>         , le_apply<OwnershipPolicy, typename sp_::pointer_type>::type
>         , le_apply<CheckingPolicy, typename sp_::pointer_type>::type
>     {
>         // ...
>     };
> [...]
Bad news.  On bcc 5.5.1, I'm trying this:
    template
    <
        typename T,
        class OwnershipPolicy = ref_counted<_>,
        class ConversionPolicy = disallow_conversion<_>,
        class CheckingPolicy = assert_check<_>,
        class StoragePolicy = scalar_storage<_>
    >
    class smart_ptr;
    template <typename F, typename T>
    struct apply_lambda
    {
        typedef typename mpl::lambda<F>::type f_;
        typedef typename mpl::apply<f_, T>::type type;
    };
# define BOOST_STORAGE_POLICY       \
    apply_lambda<StoragePolicy, T>::type
# define BOOST_POINTER_TYPE(T)      \
    typename BOOST_STORAGE_POLICY::T
# define BOOST_CHECKING_POLICY      \
    apply_lambda<CheckingPolicy, BOOST_POINTER_TYPE(stored_type)>::type
# define BOOST_OWNERSHIP_POLICY     \
    apply_lambda<OwnershipPolicy, BOOST_POINTER_TYPE(pointer_type)>::type
# define BOOST_CONVERSION_POLICY    \
    apply_lambda<ConversionPolicy, BOOST_POINTER_TYPE(pointer_type)>::type
    template <typename T, BOOST_SMART_POINTER_PARAMETERS>
    class smart_ptr
        : public optimally_inherit<
            optimally_inherit<
                BOOST_STORAGE_POLICY,
                BOOST_OWNERSHIP_POLICY
            >::type,
            optimally_inherit<
                BOOST_CHECKING_POLICY,
                BOOST_CONVERSION_POLICY
            >::type
        >::type
    {
        //...
    };
And I'm getting:
    "Dependent type qualifier 'scalar_storage<_>' has no member named
'apply'"
Also, I had to specify 'using boost::mpl::_;', since it didn't recognize it
otherwise.
I notice that this is already done in MPL, though.  Not sure what the deal
is.
BTW, I'm just #including <boost/mpl/lambda.hpp>.  I'm not sure if I need
anything
else.
Dave