$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
From: Aleksey Gurtovoy (agurtovoy_at_[hidden])
Date: 2007-06-12 06:42:43
Andrej van der Zee <mavdzee_at_[hidden]> writes:
> Than you for the quick reply :) Now I reimplemented
> intersect by converting the type sequences to mpl::set
> and do a mpl::has_key instead of mpl::contains:
> 
> template <typename seq1, typename seq2>
> struct intersect
> {
>   typedef typename copy<seq2
>      , inserter< set<>, insert< _1, _2 > >
>      >::type set_seq2;
> 
>   typedef typename copy_if<seq1
>      , has_key <set_seq2, _1> 
>      , back_inserter < vector<> >
>      >::type type;
> };
> 
> Now I would like to optimize this and only convert to
> a set if the type sequence does not support
> mpl::has_key. How should I do this?
Ideally, we should have a metafunction that would allow you to query
whether the sequence (or any other library entity) supports a
particular concept (Associative Sequence in your case).
In absence of that, something like the following should work:
    template< typename Sequence, typename Dummy = boost::mpl::false_ >
    struct is_Associative_Sequence
       : boost::mpl::false_
    {
    };
    template< typename S >
    struct is_Associative_Sequence< 
              S
            , typename boost::mpl::has_key_impl< 
                  typename boost::mpl::sequence_tag<S>::type
                >::template apply<S,S>::type
            >
       : boost::mpl::true_
    {
    };
    int main(int argc, char *argv[])
    {
         BOOST_MPL_ASSERT_NOT(( is_Associative_Sequence< boost::mpl::vector0<> > ));
         BOOST_MPL_ASSERT(( is_Associative_Sequence< boost::mpl::map0<> > ));
    }
HTH,
-- Aleksey Gurtovoy MetaCommunications Engineering