|
Boost : |
From: Aleksey Gurtovoy (agurtovoy_at_[hidden])
Date: 2003-02-20 21:54:32
Trey Jackson wrote:
> >template <class DataType, class FunctionType =
> boost::function1<void,
> >DataType> >
> >class work_crew {
> > std::list<DataType> queue_;
> > FunctionType engine_;
> >public:
> > work_crew(FunctionType const& tocall);
> > void add(DataType d) { queue_.push_front(d); };
> > void dowork()
> > {
> > typedef typename std::list<DataType>::iterator iterator_t;
> > for (iterator_t iter = queue_.begin(); iter !=
> queue_.end(); ++iter)
> > tuples::apply(this->engine_, *iter); // here
> > };
> >};
>
> Question: does the above work even if my work_crew is still the
> vanilla:
>
> work_crew< int, boost::function<void, int> > vanillaCrew(....);
>
> or would I need
>
> work_crew< tuples::tuple<int>, boost::function<void, int>
> > closeToVanillaCrew(....);
>
Not as I wrote it. It's a relatively easy to achieve, though -
void dowork()
{
this->do_work(is_tuple<DataType>());
};
void dowork(mpl::false_c)
{
typedef typename std::list<DataType>::iterator iterator_t;
for (iterator_t iter = queue_.begin(); iter != queue_.end(); ++iter)
this->engine_(*iter);
}
void dowork(mpl::true_c)
{
typedef typename std::list<DataType>::iterator iterator_t;
for (iterator_t iter = queue_.begin(); iter != queue_.end(); ++iter)
tuples::apply(this->engine_, *iter);
};
... except that you would have to implement 'is_tuple' yourself. Not a big
deal, but definitely an inconvenience; should be in the library.
>
> - I ask b/c of the 'tuples::apply(...)' portion.
> At first glance, it's not clear that
>
> int i;
> tuples::apply(this->engine_, i)
>
> would not work (b/c i is not a tuple).
It wouldn't, as it is. It's an interesting question if it should. IMO a
separate function, let's say 'as_tuple' (analogous to MPL's 'as_sequence')
would be a cleaner solution here,
int i;
tuples::apply(this->engine_, tuples::as_tuple(i)); // OK
tuple<int> ti;
tuples::apply(this->engine_, tuples::as_tuple(ti)); // OK, too
since there are other places there one would like to have this machinery. Of
course, 'tuples::apply' still can do this 'as_tuple' call internally. Right
now I don't have a strong opinion whether it should or not.
Aleksey
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk