How to write a predicate for mpl::find_if that is able to work with placeholders?
Hi list,
I have a problem that bothers me since days. It seems, that I am always
doing something wrong. I try to write a meta function, that is able to
work with placeholders and is applicable to mpl::find_if. I understand
the example from the documentation where is_same is used, which is in my
understanding also a meta function. is_same gets always the current
element of the sequence and compares it with the type given as second
template argument to itself. Correct me if I am wrong at this point.
So far so good, what I need is not the comparison to the type but
instead a comparison with an encapsulated type, a kind of tag type if
you want. Here is my class template
template<int i>
struct Slot {
typedef Slot type;
typedef int_<i> slot_id;
};
and I would like to test whether a certain slot_id is contained within a
sequence, because the Slot class template may have different further
template arguments, here omitted for the sake of clarity.
My created meta function is:
template
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
I solved it. I crawled through the mpl sources (not an easy task) and
found how it has to work.
The predicate needs to be defined as:
template
template<int i> struct Slot { typedef Slot type; typedef int_<i> slot_id; }; typedef vector
, Slot<10>, Slot<15> > slots; typedef find_if > >::type t10; BOOST_MPL_ASSERT(( is_same< deref<t10>::type, Slot<10> > ));
This works as intended. However, finding out how to write such a predicate, was very hard. Providing examples, describing the different kinds of predicates and how they need to be written in order to work with placeholders, would be very helpful. Maybe such things could be added to the mpl documentation, because I am sure, I am not the first that came up with such an issue. Regards, Michael -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (GNU/Linux) Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/ iQEcBAEBAgAGBQJMmP6eAAoJEKn9/33w5fU9FQAH/0gzuptHEBfAqfkVrmjD3/+X ibhtkSMCyXarkTSbTLYeJ7mOZ7cZ9hMpa2pLvQG0W6jLFvyjVnL+zJDrIbNFDFs9 ++nIzlijFqnaVSqi8WRAw5mXn9Ai2j0NFRyBDz70N+fPFkm+KsRDyL6pME6oLI+u WDRG4jexnLeomrIePrWbTdpNQaTKerp91cnR/6wJdMNBgDxePnP9Yzye5ltPsJzi H7SpqqHpX9yXxslvMi7vN7V8qrPwHx1Y17ILzIP77/EA/hBpFkcxPC8H8YdoUF9n UxIJ5RGwq54bEgF8qvVKkZsZy8s5u42H3E+rbNxmUcoQmaQ+Ow7gvEzQqVJTbHI= =siFh -----END PGP SIGNATURE-----
I solved it. I crawled through the mpl sources (not an easy task) and found how it has to work.
The predicate needs to be defined as:
template
struct contained { static const int value=is_same ::value; template struct apply; }; I tested again and I realized that the nested apply may be omitted and it works also as it should.
template<int i> struct Slot { typedef Slot type; typedef int_<i> slot_id; }; typedef vector
, Slot<10>, Slot<15> > slots; typedef find_if > >::type t10; BOOST_MPL_ASSERT(( is_same< deref<t10>::type, Slot<10> > )); This works as intended. However, finding out how to write such a predicate, was very hard. Providing examples, describing the different kinds of predicates and how they need to be written in order to work with placeholders, would be very helpful. Maybe such things could be added to the mpl documentation, because I am sure, I am not the first that came up with such an issue.
Regards, Michael
participants (1)
-
Michael Schulze