> -----Original Message-----
> From: David B. Held [mailto:[EMAIL PROTECTED]]
> Sent: Monday, January 06, 2003 8:14 PM
> To: [EMAIL PROTECTED]
> Subject: [boost] Re: Hello MPL world!
> 
> While this is a cute idea, my first impression would be: "Uh...is this
> really something I could use in my own code?"  On the other hand,
> I seem to use compile-time if more than anything else, even in "user
> code".  I suspect that most people will use mpl::if_ and type traits
> more than anything else, so I think Dave's original example with
> is_pointer<> would connect with the most programmers.  On the
> other hand, I suspect that library authors are more likely to use the
> type containers and algorithms, so an example illustrating those might
> be more appropriate for them.  So I guess it depends on the
> intended audience.

> P.S. Outputting "Hello, world" in a way that generates significantly
> more code than the run-time version is probably not a good way to
> endear users to metaprogramming. ;>

The original version I suggested used fold, and for that, you do need to
use if_ since you need to determine whether to call Prev::eval().  I didn't
post my implementation since it took me quite a while to get it working
with VC6.5 and I thought only the general concepts were necessary,
not a full blown example.  In any case, I think just using if_ and type
traits lacks the "small rush of excitement when you see it work."

Regarding the "much more code," metaprogramming is used to
produce a lot of inline code in Blitz style templates.  This is considered
a type of optimization, mainly in speed.  If there weren't a cout.write,
I think my example would work faster than the equivalent of using
streaming operators <<.

As for usefulness, I agree that the next thought after the rush of
excitement, is "so what?"  I could argue that doing for_each on the
vector_c is not different than doing for_each on a compile time
vector of types.  In fact, the functor receives a type, not a character.
Generation of long sequences of code is one use of
metaprogramming.  A vector of pairs, might be used to implement
read serialization of a discriminated union.  This is much more
useful, whether for a library author or not, but much more complex
for a beginning example to understand:

list< pair<int_c<0>, int>, pair<int_c<1>, double>, pair<int_c<2>, string> >

int discriminator;
stream >> discriminator;
variant<transform<typelist,select2nd>::type> v;
for_each<typelist, identity>(serialize_if_appropriate(discriminator, stream, v));

with the following definition:

struct serialize_if_appropriate
{
public:
   ...
   template <class T>
   void operator()(T&) const
   {
      if (T::first::value == discriminator) {
          T::second::type t;
          stream >> t;
          v = t;
      }
   }

private:
   istream& stream;
   int discriminator;
   variant<typelist> v;
};
_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to