Andrej van der Zee
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
struct intersect { typedef typename copy , insert< _1, _2 > > >::type set_seq2; typedef typename copy_if
, 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::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