Hi,
I have a mpl::vector of types. Each of the types in the vector have
themselves another nested mpl::vector that is a sequence of enums. I have
include the code below.
What I am trying to do is take the original sequence and make a new sequence
based on the predicate that only elements with certains enums in their
nested vector be included in the new sequence. I have included more notes
in the embedded comments.
I was thinking of using mpl::copy_if but am having trouble getting the
predicate right.
Wanted to know if anyone could steer me in the right direction. I am
trying
to fill in the ??? below. I am having trouble writing a custom predicate.
Thanks in advance.
Regards,
Bruce
#include <string>
#include <iostream>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/begin_end.hpp>
#include <boost/mpl/deref.hpp>
#include <boost/mpl/count_if.hpp>
#include <boost/mpl/size.hpp>
#include <boost/mpl/for_each.hpp>
#include <boost/type_traits/is_member_pointer.hpp>
#include <boost/mpl/vector_c.hpp>
#include <boost/mpl/copy_if.hpp>
#include <boost/mpl/less.hpp>
#include <boost/mpl/placeholders.hpp>
#include <boost/mpl/find.hpp>
namespace mpl = boost::mpl;
using namespace mpl::placeholders;
enum colors
{
red,
blue,
green,
yellow
};
template<typename COLORTYPES>
struct TestClass
{
typedef COLORTYPES colortypes;
};
void func()
{
// come up with a interface to simplify this like vector_c - only it must be
able to handle enums - I would think one would already exist
typedef mpl::vector<
mpl::integral_c<colors,red>
, mpl::integral_c<colors,green>
, mpl::integral_c<colors,blue>
> colorcoll1;
typedef mpl::vector<
mpl::integral_c<colors,red>
, mpl::integral_c<colors,blue>
> colorcoll2;
typedef mpl::vector<
mpl::integral_c<colors,green>
> colorcoll3;
typedef mpl::vector<TestClass<colorcoll1>,
TestClass<colorcoll2>,
TestClass<colorcoll3> > testvector;
std::cout << " SIZE IS " <<
mpl::size<testvector>::value << std::endl;
// would like to make a new vector from testvector that contains only those
types that have green in their nested vector colortypes.
//In other words, go from testvector which has three types to a vector that
only has TestClass<colorcoll1> and TestClass<colorcoll3>
// typedef mpl::copy_if<testvector, ???? >::type testvectorwithgreen;
// I can do it successfully when operating directly on the container as
below, but am having trouble deterimining the predicate for the above case
typedef mpl::vector_c<int, 1,2,3,4,5,6,7,8> intColl;
std::cout << mpl::size<intColl>::value << std::endl;
typedef mpl::copy_if<intColl, mpl::less<mpl::_1, mpl::int_<5> >
>::type
newIntColl;
std::cout << mpl::size<newIntColl>::value << std::endl;
}
int main()
{
func();
return 0;
}