$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
From: Tobias Schwinger (tschwinger_at_[hidden])
Date: 2008-01-13 05:47:10
Joel de Guzman wrote:
> Tobias Schwinger wrote:
>> Joel de Guzman wrote:
>>> Steven Watanabe wrote:
>>>> AMDG
>>>>
>>>> Tobias Schwinger wrote:
>>>>> Joel de Guzman wrote:
>>>>>   
>>>>>>      c0, c1, ... cN          Returns a fusion sequence of Case objects
>>>>>>     
>>>>> seemingly equivalent to
>>>>>
>>>>>         (c0, c1, ... cN)
>>>>>
>>>>> (note: Application of comma operator ;-)).
>>>>>
>>>>>
>>>>> ?! Why doesn't it just return another (compound) Case object and leave 
>>>>> the Sequence an unspecified implementation detail...
>>>>>   
>>>> So you want switch_ to be
>>>>
>>>>   template<class R, class I, class Cases>
>>>>   requires Case<Cases> && BuiltInIntegerOrEnum<I>
>>>>   R switch(I i, Cases cases);
>>>>
>>>> IMO, There is a very big problem here.
>>>> Suppose that you have a fusion sequence that holds your
>>>> cases and function objects coming from somewhere else.
>>>> The problem of adapting it to switch_ is no easier than it
>>>> would be with my original interface.
>>> Oh man, either my headache is killing me, or I am currently in
>>> dumb mode. I can't understand both Tobias and Steven. What's
>>> a "compound Case object"?
>> (c0,c1,...,cN) being just another 'Case' rather than a 'Sequence'.
> 
> o..k... Hmm.. so how would the resulting case object for this
> expression look like:
> 
>      case_c<1>(f1), case_c<2>(f2)
> 
> ?
     template< class SeqCases >
     struct sequenced_case
     {
         SeqCases seq_cases;
         typedef SeqCases seq_cases_t;
         sequenced_case(SeqCases const& s)
            : seq_cases(s)
         { }
         typedef mpl::transform_view< SeqCases,
             fusion::result_of::first<_> > labels;
         template< typename Result, class I >
         Result apply(I const&)
         {
             return fusion::at<I>(this->seq_cases);
         }
     };
If case_c<1>(f1) has the type C1 and case_c<2>(f2) has the type C2 the 
comma operator's result type is
     sequenced_case< joint_view<C1::seq_cases_t,C2:::seq_cases_t> >
'seq_cases_t' would not have to be part of the Concept, because 
'switch_' doesn't care about it.
Regards,
Tobias