"Yitzhak Sapir" <[EMAIL PROTECTED]> writes:

> 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."

Yeah, it doesn't do very well in that department.

> 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 <<.

Dave's mention of efficiency was the weakest part of the argument, but
significant nonetheless.

> 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.

Yep.  I'm nervous about showing iteration and sequences in a this
example, though.  There's nothing that sophisticated going on in
"hello, world."

> 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:
...

Sure, it's comparitively easy to come up with useful examples that are
more complicated.  Incidentally, yours needs some tweaks for
generality.  The main reason is that for_each tries to
value-initialize an instance of each of the types it processes and
passes that to the function object.  If the type isn't
default-constructible, it won't compile.  I'm not sure that preserving
this property is worthwhile.  Opinions, Aleksey?

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

int discriminator;
stream >> discriminator;
variant<transform<typelist,select2nd>::type> v;

for_each<typelist, wrap>(serialize_if_appropriate(discriminator, stream, v));
                   ^^^^
with the following definition:

struct serialize_if_appropriate
{
public:
   ...
   template <class W>
   void operator()(W&) const
   {
      typedef W::type T; // <--

      if (T::first::value == discriminator) {
          T::second::type t;
          stream >> t;
          v = t;
      }
   }

private:
   istream& stream;
   int discriminator;
   variant<typelist> v;
};

-- 
                       David Abrahams
   [EMAIL PROTECTED] * http://www.boost-consulting.com
Boost support, enhancements, training, and commercial distribution

_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to