Boost logo

Boost :

From: Steven Watanabe (steven_at_[hidden])
Date: 2006-09-13 15:04:47


AMDG
> So far I see only that it adds more complexity.
> 1) You introduced circular dependency between to_ostream operation and arguments
> 2) The any<> now takes argument wrappers rather than a list of operations
>

What about this?

struct to_ostream : function<to_ostream, any_arg<0>&(any_arg<0>&, const
any_arg<1>&)> {
    //...
};
typedef boost::mpl::at_c<to_ostream, 0>::type ostream;
typedef boost::mpl::at_c<to_ostream, 1>::type ostreamable;

Using to_ostream directly will get both of these. Each any_arg<...>
can be used more than once:

struct plus : function<plus, any_arg<0>(const any_arg<0>&, const
any_arg<0>&)> {
    //...
};

At this point typedef any_arg<0> anyT; yields the original interface.

> If you need an operation that takes anys of different types why don't you do it in a straightforward manner?
>
> // Interface for storing reference_wrapper<ostream&> objects
> typedef any<ostream_ref_operations> ostream_ref;
>
> struct to_ostream
> : function<ostream_ref&(ostream_ref&, anyT const&)>
> {
> // ...
> };
>
>

In this case that works but it doesn't allow the other operations of
ostream to vary.
Further, it prevents dispatching on the ostream since I don't know that
dispatching is needed.

The main implementation problem I have is:
struct f : function<f, any_arg<0>(const any_arg<0>&, const any_arg<1>&)> {};
template<>
struct overload<f, int> {
    typedef boost::mpl::vector<
       float(int, long), //ok - we know enough to instantiate all the
operations of arg<f, 0> for float
       char(char, int), //ok - the operations for char are already
instantiated
       bool(float, int) //illegal - can't instantiate all the
operations for bool
> type;
};

at_c<f, 1>::type doesn't know what other operations at_c<f, 0>::type uses.

In Christ,
Steven Watanabe


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk