Boost logo

Boost Users :

From: Eric Friedman (ebf_at_[hidden])
Date: 2006-05-25 01:47:25


Hi Scott,

The short answer is that, assuming everything is inlined by the
compiler, the way to think of apply visitor is something like:

   switch (myVariant.which())
   {
   case 0: myVisitor(get<T0>(myVariant)); break;
   case 1: myVisitor(get<T1>(myVariant)); break;
   ...
   case n: myVisitor(get<Tn>(myVariant)); break;
   default: {
       switch (myVariant.which())
       {
       case n+1: myVisitor(get<Tn+1>(myVariant)); break;
       case n+2: myVisitor(get<Tn+2>(myVariant)); break;
       ...
       // and so on
       }
     }
   }

Note that the secondary switches (i.e., in the default switch case) may
in fact not be inlined by the compiler, in which case there would be a
function call followed by another switch.

HTH,

Eric

Scott Meyers wrote:
> If I invoke apply_visitor, what is the time complexity wrt the number of types
> that may be in the variant? The doc doesn't seem to address this. I looked at
> the source code, but all I can remember before my head exploded due to exposure
> to the MPL and the PPL was "switch" (which suggests constant time) and
> "unrolling" which suggests either linear or constant time, depending on what is
> being unrolled. Does anybody know what the time complexity of apply_visitor is?
>
> My real question is whether applying a visitor to a variant is more efficient
> than a cascading series of calls to get. I know that the following runs in
> linear time wrt the number of types in the variant,
>
> if (T1 *p = get<T1>(&myVariant)) ...
> else if (T2 *p = get<T2>(&myVariant)) ...
> else ...
> else if (Tn *p = get<Tn>(&myVariant)) ...
>
> but what about this?
>
> apply_visitor(myVisitor, myVariant);
>
> Thanks for any enlightenment.
>
> Scott


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net