I'm trying to use the MPL for the first time, and I have two questions.
First, I want to use BOOST_MPL_ASSERT to say that at least one of two
conditions is true. For the time being, one of the conditions is always
false, so this is what I've tried:
BOOST_MPL_ASSERT((
false
||
boost::is_same
BOOST_MPL_ASSERT operates on types, this also applies to mpl::or_
Try out:
#include
Just an addition to the second question...
Unfortunately, I forgot my MPL book at work :(
But I remember, that in the chapter about physical quantities authors show
how to compare quantity types (one which is iniaital mpl::vector like
mpl::vector_c
Funny, but my girl friend just found the book in the shelf. On page 45-46 is an example with the quantities type checking. It relies on the mpl equal algorithm: http://www.boost.org/libs/mpl/doc/refmanual/equal.html It can test if two sequences have elements of the same type ;). But I have a feeling, that I misunderstand you. Would you like to check if TypeList2 have the elements of same type as TypeList1 or would you like to find out if TypeList2 is a subsequence of TypeList1, which can start somewhere in the middle of TypeList1 and go until the end? If you are looking for a susequence implementation it should not be so difficult to implement the contains meta function :). You can operate on iterator ranges and decide if one vector is a subsequence of another. mpl::iterator_range is also a model of forward, bidirection and random access sequence, so you can operate on that the subsequence vector and equal. Just in addition: I like the following doc link a lot: http://www.boost.org/libs/mpl/doc/refmanual/refmanual_toc.html Here you can find structured reference of supported mpl data structures and algorithms with examples. With Kind Regards, Ovanes -----Original Message----- From: Scott Meyers [mailto:usenet@aristeia.com] Sent: Freitag, 16. März 2007 23:48 To: boost-users@lists.boost.org Subject: Re: [Boost-users] [MPL] 2 Newbie Questions Ovanes Markarian wrote:
Try out:
#include
#include #include
Missing #includes! Sigh. There's no
Hi Scott, Scott Meyers wrote:
I'm trying to use the MPL for the first time, and I have two questions. First, I want to use BOOST_MPL_ASSERT to say that at least one of two conditions is true. For the time being, one of the conditions is always false, so this is what I've tried:
BOOST_MPL_ASSERT(( false || boost::is_same
)); It won't compile, so I tried this:
BOOST_MPL_ASSERT(( mpl::or_(false, boost::is_same
) )); It won't compile either. I'm guessing that I have to use mpl::false_ or something in place of false, but that doesn't work either. Can somebody please tell me the proper way to say what I want to say?
Since we're in the "type system world", there are no (unwrapped)
constants - there are types and only types. So, there are no function
calls, round parentheses and no operators - we have to use class
templates, /metafunctions/, for the operations, because their
specializations are types and they can hold a nested 'type' member for
the result -- even templates and constants (but for returning lesser
beings like that we use a 'type' member pointing back to the nesting
class to have a proper metafunction).
#include
My second question is about the existence of an MPL algorithm akin to the STL algorithm includes. Given two MPL vectors V1 and V2, I want to know if all the types in V1 are also in V2. I know about mpl::contains, but I can't find mpl::includes. Is there one, or do I need to write it myself?
I'd probably do it like this:
#include
I have the MPL book, so references to that are fine, in addition to anything online.
Still missing in my collection, unfortunately. Still waiting for the discount price together with "Effective MPL" ;-)... Regards, Tobias
on Fri Mar 16 2007, Scott Meyers
I'm trying to use the MPL for the first time, and I have two questions. First, I want to use BOOST_MPL_ASSERT to say that at least one of two conditions is true. For the time being, one of the conditions is always false, so this is what I've tried:
BOOST_MPL_ASSERT(( false || boost::is_same
)); It won't compile
Generally C++ gets unhappy with you when you try to apply arithmetic operators to types. What you've done above is similar to BOOST_MPL_ASSERT(( false || int )) Try this (untested): BOOST_MPL_ASSERT(( boost::mpl::or_< boost::mpl::false_ , boost::is_same< CallerConstraints, CodeConstraints::Ignore_Constraints > > )) Two things to consider: * Are you missing a typename before CodeConstraints, or is Ignore_Constraints not a dependent type in this context? * Is is_same the appropriate test, or do you really want something like mpl::equal?
, so I tried this:
BOOST_MPL_ASSERT(( mpl::or_(false, boost::is_same
) ));
mpl::or_ is a metafunction just like all the others. You need the angle brackets.
It won't compile either. I'm guessing that I have to use mpl::false_ or something in place of false, but that doesn't work either. Can somebody please tell me the proper way to say what I want to say?
My second question is about the existence of an MPL algorithm akin to the STL algorithm includes. Given two MPL vectors V1 and V2, I want to know if all the types in V1 are also in V2. I know about mpl::contains, but I can't find mpl::includes. Is there one, or do I need to write it myself?
I have the MPL book, so references to that are fine, in addition to anything online.
// (untested)
template
David Abrahams wrote:
template
struct includes : boost::is_same< typename mpl::find_if< InnerSequence , mpl::not_< mpl::contains > >::type , typename mpl::end<SubSequence>::type > {};
Okay, thanks very much. This works for me, and I even pretty much
understand it :-).
Unfortunately, I can't make the leap from this to what I really want,
which is to provide a predicate to contains for determining whether two
types are the same.
I think I need to do something like this, and I apologize in advance for
what will probably strike you as appalling:
// returns whether Seq1 includes each of the elements in Seq2.
// Pred defines whether 2 types are the same.
template
{}; I don't know how to refer to the current elements of the two calls to find_if, and I don't know whether it's a syntax issue or if I'm just approaching this incorrectly. Help? Thanks, Scott
participants (4)
-
David Abrahams
-
Ovanes Markarian
-
Scott Meyers
-
Tobias Schwinger