|
Boost Users : |
From: Steven Watanabe (steven_at_[hidden])
Date: 2008-01-10 17:01:30
AMDG
Tobias Schwinger <tschwinger <at> isonews2.com> writes:
> >
> > To be honest, I really don't see your point. I still don't see why
> > you'd want to build A on top of B.
> >
>
> 1. As a thought experiment to figure out which of the two variants is
> the more basic one, and
>
> 2. for parameterizing a single function with compile time information
> looked up by index (it's quite common and -as you can probably guess-
> the index can be very handy inside the metaprogram).
>
> Now that I have figured out that your interface accepts sequences, we
> can actually express the transforms between the two:
>
> A ---> B: function := L(I): functions[I]()
> B ---> A: transform(cases, L(I): make_pair<I>(bind(function,I())))
>
> // Notation:
> // =========
> // uppercase - types
> // lowercase - objects
> // L(args): - lambda composition
>
> I don't expect us to a reach consensus, but hopefully we do understand
> each other's points now.
How about:
switch<result_type>(n, Cases, f, default?)
Make Cases a fusion sequence the types of which must have
a nested ::value.
Then, make each case look like:
typedef fusion::result_of::value_at_c<Cases, n>::type case_n;
case case_n::value:
if(returns<case_n>()) return(f(fusion::at_c<n>(cases)));
else f(fusion::at_c<n>(cases));
If Cases is an MPL sequence this becomes equivalent to A.
By using
template<int N, class F, bool fallthrough = false>
struct case_t {
static const int value = N;
F impl;
};
template<int N, class F>
struct returns<case_t<N, F, true> > : mpl::false_ {};
in Cases and
template<class R>
struct call_function {
template<class T>
R operator()(T t) {
return(t());
}
};
for f it becomes B.
Just a thought...
In Christ,
Steven Watanabe
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